如果我有一个具有私人可见性的实例变量,我应该使用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;
}
}
答案 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
属性,其中包含add
和remove
操作的私有设置器,而getter是公共的。如果其他对象可以立即更改其值,那么您的setter应该是公共的。
答案 7 :(得分:0)
最佳做法是设置一个二传手,但如果没有它我就不会觉得我做错了,因为我可以在以后添加它,只要它在设置之前需要一些动作(例如验证)
在OOP术语中,由于你仍然“封装”在你对象的黑盒子后面,我不确定它真的很重要,而且没有一个setter仍然没问题。
我会尝试保持一致,并确保您使用工作软件作为进度的衡量标准。
答案 8 :(得分:0)
我不认为这里有明显的赢家,这是一个风格问题。许多人更喜欢使用一个二传手,即使在课堂上也是如此,他们说它可以提供一个单一的变化点,例如验证,更容易跟随谁更改字段的值。虽然IntelliSense可以使用现代IDE,但在大多数情况下,恕我直言都不需要进行验证,因此准备它可能是投机性普遍性的温和情况。因此,有时直接设置值会更简单。
答案 9 :(得分:0)
我使用方法的主要原因是,如果一个变量与第二个变量相关,必须同时更改(考虑线程和并发问题)。