簡體   English   中英

java中的類方法和構造函數混淆

[英]Class method and constructor confusion in java

我有一個類,它有責任用兩個輸入參數創建一個簡單的方法。 該方法需要用於在其他類中創建其他方法。 我的問題是,我寫它的方式看起來是否正確? 當在另一個類中調用此方法時,它會是什么樣子?

public class IntlDensity {

    static double p = PhysicalConst.pi; 

    public IntlDensity(double m, double r) {
    }

    public double irho (double mass, double rad) {
       return(mass/(((4.0/3)*p*Math.pow(rad, 3))));
    }
}

你可能想做的是:

public class PhysicalBody {

    private double mass;
    private double rad;

    public PhysicalBody(double m, double r) {
        this.mass = m;
        this.rad = r;
    }

    public double getIrho() {
       return(mass/(((4.0/3)*PhysicalConst.pi*Math.pow(rad, 3))));
    }

    public double getMass() { return mass; }
    public double getRad() { return rad; }
}

這將創建一個新對象,存儲您在構造函數中指定的massrad ,然后您可以根據需要查詢該對象的irho。 請注意,我已將該類命名為更好地描述它包含的內容。 考慮對象,而不是活動。

您現在可以根據需要添加更多方法。

一般來說,從另一個類中提取靜態值並以你的方式復制它們是一個壞主意 - 只需要像我這里一樣引用它或者進行靜態導入,這樣你就不需要PhysicalConst. 一直但實際上仍然引用相同的值。

您還可以考慮根據您是否預期它們不斷變化來使質量和rad保持不變。

  1. 你的構造函數沒用,因為你沒有對傳入的參數做任何事情。
  2. 不要創建引用現有其他靜態字段的新靜態字段
  3. Pi在Math中被定義為常量,因此不要在其他包中定義它
  4. Irho應該是靜態的,因為它不使用該類的任何成員。

根據您的實際代碼,您可能希望將質量等傳遞給構造函數,並且不要將任何內容傳遞給irho,盡管數學類通常只有靜態字段和方法。

首先,無論你是新手還是經驗豐富的老手,你都會回顧代碼並意識到它可能會更好。

在這種情況下,沒有神奇的方法可以知道你是否可以“更好地”編寫你的課程,但你提示最好的方法 - 你班級客戶的觀點。 換句話說,想象一下使用IntlDensity的代碼將如何顯示。

一種方法是使用測試驅動開發 這需要一些人習慣,但單元測試作為一般事項是改進類的API的好方法,因此它對調用者有意義。

關於這個類我可以做的一點是你應該使用你的構造函數:

public class IntlDensity {
    private double mass;
    private double rad;

    public IntlDensity(double mass, double rad) {
      this.mass = mass;
      this.rad = rad;
    }

    public double irho() {
       return mass/(((4.0/3) * PhysicalConst.PI * Math.pow(rad, 3)));
    }
}

然后你的客戶會這樣做:

IntlDensity id = new IntlDensity(5, 10);
System.out.println(id.irho());

當然這取決於你想要做什么。 這就是為什么考慮到你的來電者問題。

我建議讓你的方法像這樣static -

public class IntlDensity {
  private static final double PI = PhysicalConst.pi;     // A local PI constant?

  public static double irho(double mass, double rad) {   // Static
    return (mass / (((4.0 / 3) * PI * Math
        .pow(rad, 3))));
  }
}

您是否有理由想要實例化IntlDensity對象? 如果沒有,您可以將方法設為靜態並調用它

...
IntlDensity.irho(5,2);

public class IntlDensity {

    static double p = PhysicalConst.pi; 

    public static double irho (double mass, double rad) {
       return(mass/(((4.0/3)*p*Math.pow(rad, 3))));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM