【问题标题】:Passing instance variables to instance methods vs. directly accessing them?将实例变量传递给实例方法与直接访问它们?
【发布时间】:2013-04-18 19:00:57
【问题描述】:

假设我有一个带有实例成员的类

String instanceMember;

此外,我还有 4 个访问该成员的实例方法。现在我想知道是否有任何真正的优点/缺点可以直接从实例方法访问实例成员或将实例成员作为参数传递给每个实例方法?

【问题讨论】:

  • 基本上,“感觉正确”。有时传递参考是一个好主意,就像您正在对其进行操作的一种“文档”一样。 (但永远不要害怕回去改变一个 parm 传递方案,如果它开始看起来是错误的——许多暴行都是以避免(微不足道的)改变的名义犯下的。)

标签: java code-design


【解决方案1】:

将值作为参数传递意味着您将使用参数值而不是封装值来执行计算。

如果您要对封装的数据进行操作,则没有理由将其作为参数。

【讨论】:

    【解决方案2】:

    首先使用 instance 变量的原因是避免将它们作为参数传递:您的 instance 方法可以“免费”访问它们,因为它们是已经在方法的范围内。

    将实例变量传递给方法有两个原因:

    • 方法是static - 类方法不能访问实例变量,所以需要显式传递,或者传递要操作的对象
    • 您需要使用按值传递语义 - 换句话说,您希望修改传入的值,并且希望避免创建局部变量。当方法是递归时,通常会出现这种情况。

    如果您发现自己编写的递归代码修改了作为实例变量开始的参数,在许多情况下,将您的方法设为private static 并添加一个public 实例方法来启动递归链并收获结果。

    【讨论】:

    • 在第二种情况下,从技术上讲,您并没有传递实例变量。
    • @HotLicks 好点,谢谢!我在底部添加了一个讨论,以详细说明在第二种情况下该怎么做。
    • 我认为当你谈论对象时,“按值传递语义”的东西会让人感到困惑。通过将对象引用传递给方法,而不是让方法引用实例 var,您不会改变修改对象将产生全局影响的事实。这个领域是新手有时会感到非常困惑的领域。
    【解决方案3】:

    如果这些方法是操纵持久性成员变量状态的公共方法,那么您实际上不应该传递它。例如,如果您必须执行以下操作,则可能应该直接由方法操作而不是传入:

    myObject.SomeMethod(myObject.instanceMember, 15);
    

    这应该只是:

    myObject.SomeMethod(15);
    

    如果每次调用都可能改变某些内容(例如,上述方法中神秘的15),您将需要传递它。

    【讨论】:

      【解决方案4】:

      这在很大程度上取决于您如何使用它。如果你的类的使用频率不高,那么不会有明显的区别。

      如果您经常使用类实例,并且由多个线程使用,那么在某些情况下,将其作为参数传递会更快一些。

      通常实例成员由类成员直接访问,具有静态函数的例外(由于显而易见的原因)。

      因此,请遵循您的编码约定,不要担心。等到真正重要的时候,你就会知道答案了。

      【讨论】:

        猜你喜欢
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多