假设有两种不同的方法 - 一种是静态方法,一种是非静态方法 - 需要一个实例变量。
为了进行比较,该变量在方法中使用了3-5次。
变量不会以任何方式改变。
变量的类型 - 字符串,集合,集合等也会对它应该如何编码产生任何影响。
在私有方法(静态和非静态)中使用实例变量的最佳/正确方法是什么?
当创建一个局部变量来存储值时,如果变量不会被更改,“final”关键字将提供任何优势。
编辑1:根据评论,我正在添加其他信息 无法在方法中本地创建该值。它必须来自类或类所访问的其他方法。
我的解决方案基于答案:
根据@EricJ的回答。和@Jodrell。我选择了1,并将其创建为私有静态方法。我还找到了一些细节here来支持这一点。
答案 0 :(得分:4)
当创建一个局部变量来存储值时,如果变量不会被更改,“final”关键字将提供任何优势
在Java中, final 为编译器提供了优化机会。它声明变量的内容不会改变。关键字 readonly 在C#中提供了类似的角色。
优化的额外机会是否有意义取决于具体问题。在许多情况下,算法其他部分的成本将远远大于编译器由于 final 或 readonly 而能够进行的优化。
使用这些关键字还有另一个好处。他们创建了一个价值不会改变的契约,这有助于代码的未来维护者理解他们不应该改变价值(实际上,编译器不会让它们改变)。
在私有方法(静态和非静态)中使用实例变量的最佳/正确方法是什么?
传递方法参数
该值已存储在实例中。为什么通过它?最好的情况是这并不比使用实例属性/字段更好。最糟糕的情况是JITer没有内联调用,并且会创建一个更大的堆栈帧,耗费几个CPU周期。注意:如果要调用 static 方法,则必须传递变量,因为静态方法无法访问对象实例。
使用该方法在本地存储以获取值 - this.getClaimPropertyVertices();
这就是我的一般做法。 Getters / setter可以为字段提供有意义的包装。在某些情况下,getter将初始化后备字段(当使用不调用对象构造函数的序列化程序时,C#中的常见模式。不要让我开始讨论该主题......)。
通过获取值来本地存储 - this.claimPropertyVertices;
不,见上文。
直接在方法
中使用实例变量与上述完全相同。使用此或不使用此应生成完全相同的代码。
更新(根据您的修改)
如果值在对象实例的外部,并且不应与实例一起有意义地存储,则将其作为值传递给方法调用。
答案 1 :(得分:2)
如果您使用static关键字编写函数,则有几个明显的好处。
很明显,什么输入会影响签名中的功能。
您知道该函数没有副作用(除非您通过引用传递)。这忽略了非功能性副作用,例如对GUI的更改。
- 醇>
该函数不是以编程方式绑定到类,如果您在逻辑上决定其行为与另一个实体有更好的关联,则可以移动它。然后调整任何名称空间引用。
这些优点使功能易于理解且易于重用。它们还可以使在多线程环境中使用该函数变得更加简单,您不必担心会出现传播副作用的争用。
我会解释这个答案。您应该使用static关键字编写可能可恢复的函数。如果实现,简单或明显不可恢复的功能应该只访问私有成员或getter。