Java 更改已实例化实例变量的值的正确方法是什么?

Java 更改已实例化实例变量的值的正确方法是什么?,java,instance-variables,Java,Instance Variables,如果我有一个具有私有可见性的实例变量,我应该使用setter来更改其值,还是直接更改其值 本例中的实例变量将仅在此类中更改,因此setter将是私有的。我认为使用setter是正确的方法,因为它可以本地化更改的方式/时间,但它只是出于某种原因而困扰我的东西 请参阅下面的代码,这可能有助于更清楚地表达我的问题 public class A { private int i; public A() { i = 5 } private void doSomeCalculationsA() {

如果我有一个具有私有可见性的实例变量,我应该使用setter来更改其值,还是直接更改其值

本例中的实例变量将仅在此类中更改,因此setter将是私有的。我认为使用setter是正确的方法,因为它可以本地化更改的方式/时间,但它只是出于某种原因而困扰我的东西

请参阅下面的代码,这可能有助于更清楚地表达我的问题

public class A {

private int i;

public A() {
   i = 5
}

private void doSomeCalculationsA() {
   //work done here which results in the value of i being directly changed
   i = 7
}

private void doSomeCalculationsB() {
   //work done here which results in change value of i being changed via the setter
   setI(5)
}

private void setI(int newValue) {
   i = newValue;
}

}

最好的做法是对
JavaPOJO
类的成员变量调用
setter/getter
,在您的情况下,我建议使用
setter

除非函数中实际完成了一些操作/计算,否则使用私有setter/getter是没有意义的。

我倾向于认为,在大多数情况下,越简单越好。如果你的setI只会成为一名二传手,我就不会拥有它。如果你想暗示这个方法能在某一天做更多的事情,你可以考虑有一个,但对我来说是最好的方法。 “始终在实际需要时实施,而不是在预见到需要时实施。”


如果且仅当变量未从外部访问(即,另一个对象请求其值),则可以在内部对其进行修改。否则,您将不得不使用访问器/变异器。

使用setter的原因是,如果您在更改变量时需要进行一些额外的更改或计算,或者从外部类提供对变量的有限访问。在这种情况下,它没有任何区别,但它增加了调用该方法所需的额外时间。

这取决于外部的另一个对象是否可以更改其值。例如,
ArrayList
类具有
size
属性,具有私有setter,用于在getter为公共时执行
add
remove
操作。如果其他对象可以立即更改其值,则您的setter应该是公共的。

最佳做法是拥有一个setter,但如果没有它,我不会觉得自己做错了什么,因为只有在设置之前需要一些操作(例如验证)时,我才可以稍后添加它

用面向对象的术语来说,由于您仍然被“封装”在对象的黑匣子后面,所以我不确定这是否真的很重要,没有setter也没关系


我会尽量保持它的一致性,并确保您有可用的软件来衡量进度。

我认为这里没有明确的赢家,这是一个风格问题。许多人更喜欢使用setter,甚至在类中,他们说它提供了一个单点更改,例如启用验证,并且更容易跟踪谁更改了字段的值。对于现代IDE,尽管IntelliSense可以以任何一种方式工作,而IMHO在大多数情况下都不需要验证,因此为它做准备可能是一个推测性通用性的温和例子。因此,有时直接设置值更简单。

这里有两个考虑因素——可读性和刚性。如果这个变量是真正私有的,那么直接访问该变量是完全可以的。它使变量引用更具可读性,因为毫无疑问,引用是如何工作的,引用的是什么。一目了然,这一定是一个实例变量


在过去,我常常建议为私有变量编写访问器,因为如果需要更改获取值的方式(即使是私有的),那么大量直接引用可能会使问题变得棘手。这就是刚性的问题。现在,我们有重构工具,它可以用一个菜单项抽象变量,所以如果您需要创建和调用访问器,这并不难。因此,我改变了我的建议,更喜欢直接引用的简单性和可读性,而不是访问方法。

我使用方法的主要原因是,如果一个变量与第二个变量相关,则必须同时更改(考虑线程和并发问题).

性能差异可以忽略不计。由于JIT内联,在Java中方法调用实际上是免费的。开发人员效率的成本远比CPU的成本重要。;)很明显,但是有一些小的开销,所以你不妨提一下。对于任何普通程序来说,调用方法的开销可以忽略不计,但是如果要进行一些主要的数据处理,那么每次程序想要访问一个变量时,如果没有方法调用,效率会更高。我非常喜欢OOP,但是跳过setter。setter的意义在于,您可以重构代码,而不会破坏类的外部用户。根据定义,私有方法是类的内部用户。