簡體   English   中英

在另一個方法中在構造函數中初始化最終變量

[英]Initialize final variable within constructor in another method

我有一個問題並不是那么大,但仍然讓我思考如何使用Java構造函數和方法。

我有一個代表我聲明最終的半徑的常量,並且還公開供所有人查看。 當我永遠不會改變半徑時,我不希望我的代碼充斥着getRadius()方法。

我想在構造函數中初始化常量,因為我想在分配半徑之前應用某些條件,必須滿足某些條件。 但是,這些條件確實占用了一些空間,我想將它們放在其他方法中,以使構造函數更清晰。

整個事情最初看起來像這樣

public MyProblematicClass {
   public final int radius;
   public MyProblematicClass(... variables ...) {
      if(... long criteria ...) {
         radius = n;
      }
   }
}

而且我喜歡它最終會像

public MyProblematicClass {
       public final int radius;
       public MyProblematicClass(... variables ...) {
          this.setRadiuswithCriteria(criteria);
}

private void setRadiuswithCriteria(criteria crit) {
   if(... crit ...) {
      radius = n;
   }

我知道我可能會將該方法用於其他目的,這就是給我一個'空白字段RADIUS的原因可能尚未初始化,所以我想知道是否有辦法添加一個只會是用於建造者,為清潔起見。

怎么樣(使用小半徑的半徑,因為它不是常數,如評論中所指出的):

public MyProblematicClass(... variables ...) {
    radius = getRadiusWithCriteria(criteria);
}

private int getRadiusWithCriteria(criteria crit) {
   if(... crit ...) {
      return n;
   } else {
      return 0;
   }
}

您不能在構造函數外部分配最終變量。 如你所說,方法:

setRadiuswithCriteria(criteria crit) {
   if(... crit ...) {
      RADIUS = n;
   }

可以在構造函數外部使用。

並且您必須在構造函數中將final變量設置為某個值,而不僅僅是在檢查某些條件后(總是,有時不是)。

但是,您可以使用某個函數的返回值將代碼移到構造函數之外。 例:

class MyClass {
    private final double i;
    public MyClass() {
        i = someCalculation();
    }
    private double someCalculation() {
        return Math.random();
    }
}

這樣做怎么樣?

public MyProblematicClass {
    public final int RADIUS;
    public MyProblematicClass(... variables ...) {
       RADIUS = this.setRadiuswithCriteria(criteria);
}

private int setRadiuswithCriteria(criteria crit) {
if(... crit ...) {
    return n;
}
return 0;
}

暫無
暫無

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

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