我有简单的课程:
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不应该直接将值分配给xpos
吗?这里是否允许任何操纵(如地图绘制)?
xpos
应与value
相关联 - 在没有参数的情况下创建setX()
是否有效?如果我将xpos
变量和set(float theValue)
公之于众,则会破坏xpos
和value
之间的链接,因为使用setter可以分配value
以外的任何数据
答案 0 :(得分:1)
根据您的第一个版本只有一个吸气剂:没有字段:
value
等对象生命周期发生变化的情况(可能今天不会发生,但可能会在某一天发生)将计算属性存储在字段中的唯一原因是“性能”,但如果您在设计时考虑它本身就是一个大错误。如果您有确凿的证据确实存在性能问题,则只考虑使用字段。此外,如果您只为某些对象调用getter,那么为所有对象计算它将是一种浪费。
在任何一种情况下都没有必要或有意义。
答案 1 :(得分:0)
拥有一个字段和一个getter的主要优点是它将充当一个缓存系统,这样你就不会一次又一次地计算相同的值(这可能很好,因为它可能很糟糕,取决于什么你在干嘛)结果是它会导致代码不太清晰,如果你的价值很大,它会消耗更多的内存。
对我来说,你应该使用一个字段和一个getter(如果不改变值,不要使用setter,请记住open / closed原则),但这又取决于你打算如何使用你的类。 / p>
此外,是的,您可以执行诸如在setter中进行映射的操作,这实际上是您应该使用setter的原因:您不允许直接访问您的字段,因此您可以通过字段修改控制点,这可以用于执行操作关于参数(例如检查它们的空值)