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

时间:2012-05-07 20:49:58

标签: java instance-variables

如果我有一个具有私人可见性的实例变量,我应该使用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;
}

}

10 个答案:

答案 0 :(得分:2)

我倾向于认为在大多数情况下更简单更清晰。如果你的setI只是一个定制者,我就不会拥有它。如果你想暗示该方法可以在某一天做更多的事情,你可能会考虑有一个,但对我来说YAGNI是最好的方法。

  

"当你真正需要它们时,总是要实现它们,而不是在你预见到需要它们时。"

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

最好在setter/getter类的成员变量上调用Java POJO,在您的情况下我建议使用setter

答案 4 :(得分:0)

当且仅当不从外部访问变量(即请求其值的另一个对象)时,才可以在内部修改它。否则,您将不得不使用访问者/变更者。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果外面的另一个对象可以改变它的值,它将取决于。例如,ArrayList类具有size属性,其中包含addremove操作的私有设置器,而getter是公共的。如果其他对象可以立即更改其值,那么您的setter应该是公共的。

答案 7 :(得分:0)

最佳做法是设置一个二传手,但如果没有它我就不会觉得我做错了,因为我可以在以后添加它,只要它在设置之前需要一些动作(例如验证)

在OOP术语中,由于你仍然“封装”在你对象的黑盒子后面,我不确定它真的很重要,而且没有一个setter仍然没问题。

我会尝试保持一致,并确保您使用工作软件作为进度的衡量标准。

答案 8 :(得分:0)

我不认为这里有明显的赢家,这是一个风格问题。许多人更喜欢使用一个二传手,即使在课堂上也是如此,他们说它可以提供一个单一的变化点,例如验证,更容易跟随谁更改字段的值。虽然IntelliSense可以使用现代IDE,但在大多数情况下,恕我直言都不需要进行验证,因此准备它可能是投机性普遍性的温和情况。因此,有时直接设置值会更简单。

答案 9 :(得分:0)

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