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