在Java / C#类中使用实例变量#

时间:2012-08-30 16:26:21

标签: c# java methods instance-variables

假设有两种不同的方法 - 一种是静态方法,一种是非静态方法 - 需要一个实例变量。

为了进行比较,该变量在方法中使用了3-5次。

变量不会以任何方式改变。

变量的类型 - 字符串,集合,集合等也会对它应该如何编码产生任何影响。

在私有方法(静态和非静态)中使用实例变量的最佳/正确方法是什么?

  1. 传递方法参数
  2. 使用该方法在本地存储以获取值 - this.getClaimPropertyVertices();
  3. 通过获取值来本地存储 - this.claimPropertyVertices;
  4. 直接在方法
  5. 中使用实例变量

    当创建一个局部变量来存储值时,如果变量不会被更改,“final”关键字将提供任何优势。

    编辑1:根据评论,我正在添加其他信息   无法在方法中本地创建该值。它必须来自类或类所访问的其他方法。

    我的解决方案基于答案:
    根据@EricJ的回答。和@Jodrell。我选择了1,并将其创建为私有静态方法。我还找到了一些细节here来支持这一点。

2 个答案:

答案 0 :(得分:4)

  

当创建一个局部变量来存储值时,如果变量不会被更改,“final”关键字将提供任何优势

在Java中, final 为编译器提供了优化机会。它声明变量的内容不会改变。关键字 readonly 在C#中提供了类似的角色。

优化的额外机会是否有意义取决于具体问题。在许多情况下,算法其他部分的成本将远远大于编译器由于 final readonly 而能够进行的优化。

使用这些关键字还有另一个好处。他们创建了一个价值不会改变的契约,这有助于代码的未来维护者理解他们不应该改变价值(实际上,编译器不会让它们改变)。

  

在私有方法(静态和非静态)中使用实例变量的最佳/正确方法是什么?

传递方法参数

该值已存储在实例中。为什么通过它?最好的情况是这并不比使用实例属性/字段更好。最糟糕的情况是JITer没有内联调用,并且会创建一个更大的堆栈帧,耗费几个CPU周期。注意:如果要调用 static 方法,则必须传递变量,因为静态方法无法访问对象实例。

使用该方法在本地存储以获取值 - this.getClaimPropertyVertices();

这就是我的一般做法。 Getters / setter可以为字段提供有意义的包装。在某些情况下,getter将初始化后备字段(当使用不调用对象构造函数的序列化程序时,C#中的常见模式。不要让我开始讨论该主题......)。

通过获取值来本地存储 - this.claimPropertyVertices;

不,见上文。

直接在方法

中使用实例变量

与上述完全相同。使用或不使用应生成完全相同的代码。

更新(根据您的修改)

如果值在对象实例的外部,并且不应与实例一起有意义地存储,则将其作为值传递给方法调用。

答案 1 :(得分:2)

如果您使用static关键字编写函数,则有几个明显的好处。

  
      
  1. 很明显,什么输入会影响签名中的功能。

  2.   
  3. 您知道该函数没有副作用(除非您通过引用传递)。这忽略了非功能性副作用,例如对GUI的更改。

  4.   
  5. 该函数不是以编程方式绑定到类,如果您在逻辑上决定其行为与另一个实体有更好的关联,则可以移动它。然后调整任何名称空间引用。

  6.   

这些优点使功能易于理解且易于重用。它们还可以使在多线程环境中使用该函数变得更加简单,您不必担心会出现传播副作用的争用。


我会解释这个答案。您应该使用static关键字编写可能可恢复的函数。如果实现,简单或明显不可恢复的功能应该只访问私有成员或getter。