【发布时间】:2014-06-20 09:33:32
【问题描述】:
我有简单的课程:
class Blah {
private PApplet applet;
private float value;
public Blah(PApplet theApplet, theValue) {
applet = theApplet;
value = theValue;
}
public float getX() {
return PApplet.map(value, applet.min, applet.max, applet.c1, applet.c2);
}
}
我现在想知道,是否可以像描述的那样拥有getX()?
我不应该声明一个变量xpos 和一个setter 和getter 吗?
在这种情况下,我如何决定是否应该声明一个实例变量? (其中一个实例变量值依赖于另一个实例变量)
使用xpos 实例变量,我将拥有:
class BlahBla {
private PApplet applet;
private float value;
private float xpos;
BlahBla(PApplet theApplet, float theValue) {
applet = theApplet;
value = theValue;
xpos = PApplet.map(theValue, applet.min, applet.max, applet.c1, applet.c2);
}
public getX() {
return xpos;
}
public setX(float theValue) {
xpos = map(theValue, applet.min, applet.max, applet.c1, applet.c2);
}
}
将xpos 作为实例变量的优势:
- 我不会在每次调用
getX()时都进行映射
将xpos 作为实例变量的缺点:
- 更多代码
- 使用 setter 方法时的困惑
注意事项:
setter 不应该将值直接分配给
xpos吗?这里应该允许任何操作(如映射)吗?xpos应该链接到value- 不带参数创建setX()是否有效?如果我将xpos变量和set(float theValue)设置为public - 这会破坏xpos和value之间的链接,因为使用setter 允许分配value以外的任何数据。
【问题讨论】:
-
您的原始实现不需要 setter,仅仅因为添加了 getter 并不意味着您需要 setter。如果某些东西永远不应该改变,请不要提供 setter
-
假设 xpos 没有改变,从效率的角度来看,将其保留为一个字段是有意义的,但从良好的标准角度来看,如果您按需创建 xpos、延迟加载,则几乎没有什么区别它或在构造对象时创建
标签: java oop processing instance-variables