3

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

}
4

10 回答 10

2

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

“总是在你真正需要的时候实施,而不是在你预见到你需要它们的时候。”

于 2012-05-07T20:53:50.953 回答
1

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

于 2012-05-07T20:53:34.137 回答
1

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

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

于 2012-05-07T20:57:05.113 回答
0

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

于 2012-05-07T20:53:15.777 回答
0

当且仅当变量没有从外部访问(即另一个对象请求它的值),那么在内部修改它是可以接受的。否则,您将不得不使用访问器/修改器。

于 2012-05-07T20:53:57.733 回答
0

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

于 2012-05-07T20:54:06.953 回答
0

这将取决于外部的另一个对象是否可以更改其值。例如,ArrayList该类具有size私有 setteraddremove操作的属性,而 getter 是公共的。如果另一个对象可以立即更改其值,那么您的 setter 应该是公开的。

于 2012-05-07T20:55:33.383 回答
0

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

在 OOP 术语中,由于您仍然被“封装”在对象的黑盒后面,我不确定它是否真的重要,并且没有设置器仍然可以。

我会尽量保持一致,并确保你有工作软件作为进度的衡量标准。

于 2012-05-07T20:56:33.870 回答
0

我认为这里没有明显的赢家,这是风格问题。许多人更喜欢使用 setter,甚至在类中,说它提供了一个单一的更改点,例如验证,并且更容易跟踪谁更改了字段的值。尽管 IntelliSense 可以使用现代 IDE,但恕我直言,在大多数情况下都不需要验证,因此为它做准备可能只是一种推测性普遍性的温和案例。所以有时直接设置值会更简单。

于 2012-05-07T20:56:44.333 回答
0

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

于 2012-05-07T20:57:50.137 回答