【问题标题】:Good practice in calling accessor methods?调用访问器方法的好习惯?
【发布时间】:2014-10-09 17:27:35
【问题描述】:

如果这个问题很愚蠢,请原谅我......我是编程新手。我感到困惑的一件事是,我是否应该在每次调用获取某个值的方法时实例化一个新变量,或者保留一个本地副本并更新它。

为了说明,假设我有一个机器人在迷宫中导航。机器人驱动程序操作机器人,必须获取机器人的坐标才能执行一些动作,例如感知障碍物。

public class RoboDriver {
   public void senseObstacle() {
     int[] position = robot.getPosition();
     ...
   }
}

public class RoboDriver {
   int[] robotPositionCopy;
   public void senseObstacle() {
     this.robotPositionCopy = robot.getPosition();
     ...
   }
}

机器人对象中的位置坐标始终是最新的。因此,如果我想获得更新的位置,这两个示例中哪个更好,为什么?还是没有太大区别?

【问题讨论】:

  • 这取决于您需要如何/何时使用这些信息。
  • @DaveNewton 在这种情况下,我只需要在 RoboDriver 尝试感知某些东西时更新坐标。所以每次调用 sense 时,它​​都需要更新的坐标。
  • 你可以同时使用。但是,第二种方法将数组对象保留在内存中的时间通常比局部变量长。
  • @Mohammad 所以在性能方面,第一种方法稍微好一点?
  • @Renren29 那么可能没有理由将其保存在RoboDriver 实例变量中(与第一个示例中的局部变量相反)。

标签: java


【解决方案1】:

没有实例化一个局部变量,你的说法让我觉得你可能认为这是有代价的。局部变量是完全免费的:它们只是赋予内存位置的名称,无论如何都将存在于方法的堆栈帧中。

与此相反,您的第二个示例声明了一个 instance 变量,并且该变量确实是有代价的:您的类的每个实例都必须为其在堆上保留内存,即使你只在执行方法时使用它。

所以,我认为建议是一致的:不要声明实例变量,除非您需要它们来保存长期存在的对象状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多