在另一个方法中在构造函数中初始化最终变量

时间:2012-08-01 11:40:43

标签: java android

我遇到的问题并不是那么大,但仍然让我思考如何使用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的原因可能尚未初始化,所以我想知道是否有办法添加一个方法为了清洁起见,它只会用在构造函数中。

3 个答案:

答案 0 :(得分:8)

如何使用小半径的半径,因为它不是常数,正如评论中所指出的那样:

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

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

答案 1 :(得分:4)

您无法在构造函数外部分配最终变量。如你所说,方法:

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

可以在构造函数外部使用。

你必须在构造函数中将final变量设置为某个值,而不是在检查某些条件后(总是,有时不是)。

但是,您可以使用某个函数的返回值将代码移到构造函数之外。示例:

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

答案 2 :(得分: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;
}