2012-08-01 76 views
4

我有一个问题不是真的那么大,但仍然给了我一些关于如何使用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

所有CAPS都是Java中用于常量(又名。静态成员)的惯例,而不是不改变的总决赛,只是使用常规的radius命名策略。 – 2012-08-01 11:45:29

+0

声明你的RADIUS变量是私有的,只允许通过getRadius访问它。 阅读更多关于不可变对象,以及如何限制其变量的变化值 – 2012-08-01 11:46:36

+0

@ SanjayT.Sharma感谢您指出,不知道关于命名约定除了基础知识之外......我特别是在声明代码之外的所有大写都知道哪些变量是我无法修改的,我会在问题中予以更正。 – RedOrav 2012-08-01 12:00:52

回答

8

如何(使用半径小帽子,因为它不是一个常数,在评论中指出):

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

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

函数并不总是返回值。只有C允许,而不是Java。 – peenut 2012-08-01 11:49:08

+0

@peenut我不明白你的评论。你什么意思? – assylias 2012-08-01 11:51:23

+0

@assylias我认为他意味着你不总是返回一个值,这是一个编译器错误。如果没有满足任何条件或某事,我会有一个默认值0。我认为这个解决方案非常简单,但是说方法里面有两个最终变量,即radius1和radius2。 – RedOrav 2012-08-01 11:55:50

3

不能分配给最后一个变量外的构造。如您所说,方法:

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

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

而且您必须在构造函数中设置最终变量为某个值,而不仅仅是在检查一些条件之后(总是,并非有时)。

但是,您可能会使用某些函数的返回值将代码移到构造函数外部。例如:

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

我在构造函数中检查了我的标准,我只是想把它全部放在另一个函数中以保持整洁。尽管它和assylias一样,我也会赞扬这个答案。 – RedOrav 2012-08-01 11:57:39

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; 
} 
相关问题