【问题标题】:Passing class instance variables as parameters将类实例变量作为参数传递
【发布时间】:2013-06-23 05:28:38
【问题描述】:

这是我一直在考虑的一个设计问题,但没有找到令人信服的信息。

假设我的类中有一些实例变量,现在想象我想使用该值为我的类编写一些私有功能。写这样的东西没问题:

public class Example{

    private String attribute1;

    public void setAttribute1(String att){
        this.attribute1 = att;
    }

    private void processAttribute(){
        //do something with attribute1
    }

    public void executeExample(){
        processAttribute();
    }

}

processAttribute() 在内部使用 attribute1 值。但是,许多文档说我们应该尝试限制全局变量的使用。编写这样的东西会是一种更可重用且设计良好的方式吗?

public class Example{

    private String attribute1;

    public void setAttribute1(String att){
        this.attribute1 = att;
    }

    private void processAttribute(String att){
        //do something with attribute1
    }

    public void executeExample(){
        processAttribute(this.attribute1);
    }

}

集思广益。

【问题讨论】:

  • 这不是全局变量的情况,第一个样式是正确的样式。要成为全局变量,您需要创建变量 public static 或类似的东西。

标签: parameters parameter-passing instance-variables


【解决方案1】:

许多反对全局状态的论点在这里也适用:

  • 如果该属性在 processAttribute 方法之外的其他地方使用,则很难推断程序的正确性
  • 使用全局状态的代码更难并行化:如果在处理属性时修改了属性会发生什么?
  • 更多:http://c2.com/cgi/wiki?GlobalVariablesAreBad

另一方面,它是一个私有方法,您可以随意实现它,只要您履行该类的合同即可。

【讨论】:

  • 这就是我想要达到的目的。那么,在您看来,我应该在这里使用参数吗?
  • 就我个人而言,我喜欢尽可能地保持本地化,但有时使用实例或静态属性更有意义。
【解决方案2】:

但是,许多文档说我们应该尝试限制使用 global 变量。

我认为您误解了这个概念。通常全局变量是那些声明为public static 的变量,以便可以从应用程序的任何其他部分直接访问它。

因此,在您的两个示例中,变量属性 1 都不是全局变量。它只是类的一个成员变量。

因此,我认为这两个不同的代码之间没有太大区别。

如果设计是固定的,那么我认为最好使用第一个使其更具可读性。如果将来有其他机会将其他变量作为参数而不是成员变量发送,那么您可以使用第二个实现。 (虽然我认为这完全取决于编码员的个人选择)

【讨论】:

  • 我同意你的看法,这是编码员的个人选择,两者之间没有太大区别。现在,想象一个更复杂的类,其中可以同时运行不同的线程。
  • 我没有看到这两种实现之间的任何性能差异
【解决方案3】:

首先,attribute1 不是全局属性,它只是一个类变量。使用此操作,类变量将在所有类方法中可用,因此您无需将它们作为方法参数传递。

由于这里不需要传递方法参数,所以实现它似乎不合逻辑。顺便说一句,这是我个人的看法,其他人可能有不同的想法。

【讨论】:

  • 很明显,他不需要通过它。问题是最好的设计是什么。
  • 它是类Example的一个属性。如果它被声明为 public static,那么你可以认为它是一个全局变量。
  • 不完全同意你的观点,至少 Wikipedia def 是这样。然而,正如@Goatcat 所说,这是一个设计术语,无论你想给它起什么名字......
  • @XtremeBiker 我同意你的观点,但声明全局变量的一般方式是我在之前的评论中指定的。这是另一个 SO 链接供您参考:stackoverflow.com/questions/4646577/global-variables-in-java
  • 错了..类变量不是你想的那样...静态变量被称为类变量
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2012-03-15
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多