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

您不能分配给构造函数外部的最终变量。如您所说,方法:

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 回答