在类内部使用getter/setter——是好的还是不好的实践?

6

在类的内部代码中,使用getter/setter代替直接访问实例变量,是好还是坏的做法?至少对于setter,我们可以添加额外的代码来验证值,但对于getter而言,这只是额外开销。如果我的getter/setter只是直接设置/获取值,那么Java编译器有多聪明,它是否会优化我的代码并将getter/setter替换为直接访问实例变量,从而消除方法调用的开销?


可能是 https://dev59.com/oHI_5IYBdhLWcg3wAeHl 的重复问题。 - Edwin Dalorzo
对于你问题的后半部分,是的,现代JVM会根据需要内联getter/setter。 - casablanca
6
@edalorzo - 这不是重复的问题,这里的问题是关于类成员的内部使用。 - MByD
关于编译时间,我认为你可以在这里找到答案:https://dev59.com/w17Va4cB1Zd3GeqPLqj- - franco_valente
3个回答

8

直接访问字段更为常见。对于在其他类中使用您的代码的程序员来说,setFieldName方法的值更加明显。隐藏了实现细节后,他们可能不会意识到可接受的值范围,因此保持字段私有并强制其他开发人员通过setter进行访问是有意义的。但在您自己的类内部,使用setter的情况要弱得多。如果您查看java API的源代码,您会发现getter/setter方法通常不在类内部使用。


1
这个话题没有正确答案,但我喜欢Java API的例子,所以我选择了这个答案。感谢此答案和其他答案! - stefan.at.kotlin

7

除非想在这些getter/setter中执行其他操作,否则没有必要在类内部这样做。

  • 隐藏的原因主要是为了隐藏实现细节(而且没有必要向类本身隐藏实现细节)
  • getter和setter直接访问成员变量,所以为了避免直接访问成员变量而调用它们有点多余。

关于性能-我真诚地认为,在大多数情况下,您不应该考虑性能问题,而应该根据可读性、可扩展性和可维护性来决定是调用方法还是直接访问成员变量,而不是考虑是否需要多花一秒钟。这种方法在长期内是可获益的。有优化的地方,你应该做到高效,但保持代码清晰和可维护性一旦超过20行,就变得更加重要。


1

直接访问是一件好事。然而,在同一个类中,没有人能说getter/setter访问是不好的。如果你正在开发一个Java bean,你肯定会明白我在说什么。想象一下,你正在尝试将JTextField的用户输入作为字符串获取。在这种情况下,getter方法将允许您做很多事情,包括字符串截断、修剪、大写、小写等。如果你试图通过直接访问变量来完成所有这些操作(例如:String s = textField.getText()),你会发现这样做相当困难。所以,我认为好坏取决于情况和你正在开发什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接