10

それほど大きな問題ではありませんが、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 が初期化されていない可能性がある」という理由です。きれいにするために、コンストラクターで使用されます。

4

3 に答える 3

11

どうですか(コメントで指摘されているように、定数ではないため、半径に小さなキャップを使用します):

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

private int getRadiusWithCriteria(criteria crit) {
   if(... crit ...) {
      return n;
   } else {
      return 0;
   }
}
于 2012-08-01T11:43:41.617 に答える
4

コンストラクターの外で final 変数に代入することはできません。あなたが言ったように、方法:

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

コンストラクタの外で使用できます。

そして、いくつかの基準をチェックした後だけでなく、コンストラクターで最終変数を何らかの値に設定する必要があります(常に、時々ではありません)。

ただし、関数の戻り値を使用して、コードをコンストラクターの外に移動することもできます。例:

class MyClass {
    private final double i;
    public MyClass() {
        i = someCalculation();
    }
    private double someCalculation() {
        return Math.random();
    }
}
于 2012-08-01T11:48:30.367 に答える
0

このようにしたらどうですか?

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

private int setRadiuswithCriteria(criteria crit) {
if(... crit ...) {
    return n;
}
return 0;
}
于 2012-08-01T12:04:06.803 に答える