2012-08-30 43 views
0

假设2种不同的方法 - 一种是静态的,一种是非静态的 - 需要一个实例变量。Java/C的类内实例变量的使用情况#

该变量在方法中使用3-5次不同时间进行比较。

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

此外,变量的类型 - String,Colection,Collection等在编码方式上有所不同。

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

  1. 通作为方法参数
  2. 本地存储利用该方法来获取值 - this.getClaimPropertyVertices();
  3. 通过获取值本地存储 - this.claimPropertyVertices;
  4. 在方法

直接使用实例变量当创建一个局部变量来存储值将“最终”关键字提供任何优势,如果变量将不被改变。

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

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

+3

静态方法无法访问实例字段,句点。 –

+0

它确实取决于使用变量的方法的上下文。将价值传入或可以在本地创建是否有意义?不知道方法的背景,很难回答这些问题。另外...这味道像早期的微型优化... eeeeeviiiillllll。而一个静态方法只能访问一个静态变量。 –

+0

@MattBall谢谢。我从来没有这样做过,但想要这样做,以便我能够了解/了解是否会有差异 –

回答

4

当创建一个局部变量来存储值将“最终”关键字提供任何好处,如果变量不会改变

在Java中,最后提供了一个优化的机会到编译器。它声明变量的内容不会被改变。关键字只读在C#中提供了类似的作用。

是否还有其他优化机会是有意义取决于具体问题。在很多情况下,算法的其他部分的成本将远远大于编译器由于最终只读而能够做出的优化。

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

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

通行证作为方法参数

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

通过使用获取值的方法在本地存储 - this.getClaimPropertyVertices();

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

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

不,见上文。

在方法

完全一样上述直接使用实例变量。使用这个或不使用这个应该生成完全相同的代码。

UPDATE(根据您的修改)

如果该值是外部对象实例,并且不应该有意义与实例一起存储,在把它作为一个值的方法调用。

+1

不变性是好的。它可以被反复覆盖,但你得到你应得的。 – Jodrell

+0

@Jodrell:同意...并通过扩展,函数式编程=好:) –

+0

@Jodrell:是的。像* private *这样的访问器也可以被覆盖。反思绝对是邪恶的,除非你需要它,在这种情况下,这是一个天赐之物...... :-) –

2

如果您尽可能使用static关键字编写函数,则有几个显而易见的好处。

  1. 它什么明显效果输入从签名的功能。

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

  3. 该函数在编程上与类没有关系,如果您在逻辑上确定其行为与另一个实体有更好的关联,则可以将其移动。然后调整任何名称空间引用。

这些好处的功能易于理解和更简单的重用。它们也将使得在多线程环境下使用该功能变得更简单,您不必担心会不断传播副作用。


我会告诉这个答案。您应该使用static关键字编写潜在的可重用函数。如果实施,简单的或明显不可容忍的功能应该只访问私有成员或获取者。

相关问题