在哪种情况下声明实例变量?

时间:2014-05-03 20:32:27

标签: java oop processing instance-variables

我有简单的课程:

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)公之于众,则会破坏xposvalue之间的链接,因为使用setter可以分配value以外的任何数据

2 个答案:

答案 0 :(得分:1)

根据您的第一个版本只有一个吸气剂:没有字段:

  • 更简单的代码
  • 不必担心value等对象生命周期发生变化的情况(可能今天不会发生,但可能会在某一天发生)
  • 少代码
  • 这是过早的优化:

将计算属性存储在字段中的唯一原因是“性能”,但如果您在设计时考虑它本身就是一个大错误。如果您有确凿的证据确实存在性能问题,则只考虑使用字段。此外,如果您只为某些对象调用getter,那么为所有对象计算它将是一种浪费。

在任何一种情况下都没有必要或有意义。

答案 1 :(得分:0)

拥有一个字段和一个getter的主要优点是它将充当一个缓存系统,这样你就不会一次又一次地计算相同的值(这可能很好,因为它可能很糟糕,取决于什么你在干嘛)结果是它会导致代码不太清晰,如果你的价值很大,它会消耗更多的内存。

对我来说,你应该使用一个字段和一个getter(如果不改变值,不要使用setter,请记住open / closed原则),但这又取决于你打算如何使用你的类。 / p>

此外,是的,您可以执行诸如在setter中进行映射的操作,这实际上是您应该使用setter的原因:您不允许直接访问您的字段,因此您可以通过字段修改控制点,这可以用于执行操作关于参数(例如检查它们的空值)