何时使用公共字段可以接受?

我有一个主类,它有一个线程池,很多其他类使用它来对数据库执行操作。 我目前有一个getter方法来获得工作正常的池,但看起来有点笨拙。

在任何情况下都可以使用公共字段而不是getter / setter方法吗?

在任何情况下都可以使用公共字段而不是getter / setter方法吗?

公共领域不好的主要原因是它们将实施暴露给外界。 这会导致不必要的耦合; 即过分依赖于其他类的实现细节的类。 这往往会使代码更难理解,更难以改变。 如果该字段不是final字段,则需要搜索整个代码库,以确保没有任何内容“干扰”该字段。 (好吧,IDE会让这更容易……但是将公共字段与没有setter的私有字段进行对比。)

次要原因是您无法覆盖字段。 一旦在超类中公开了一个字段,你就无法在子类中做任何修改或限制其含义的事情。 (相比之下,吸气剂和制定者可以被覆盖……)

唯一可以接受(从文体角度来看)具有“公共”字段的情况是声明字段的类是私有嵌套类或内部类。 结果是,对字段的所有依赖关系都限制在包含声明的源文件中……这否定了上面的问题。

更新 – 我忘记了public static final …但我们往往不会将这些视为字段。 无论如何,通常的做法是直接访问public static final字段。 常量的概念是故意暴露名称,类型和值……由于静态字段的性质,覆盖问题不适用。


我目前有一个getter方法来获得工作正常的池,但看起来有点笨拙。

“笨拙”是一个意见/品味的问题。 就个人而言,我认为与obj.instance相比, obj.getInstance()并不笨拙。 它只是Java方式1

另一方面,如果您没有getInstance()方法,则使用该池的所有类都必须具有对instance字段的硬编码引用。 如果(由于某些原因)你需要改变访问池的方式(例如添加安全检查,添加计数器,使池创建变得懒惰,确保访问正确同步),那么你必须改变每个和您编码引用该字段的每个地方。 但是有了吸气剂,你只需要改变一个地方。

1 – 显然,其他语言的做法不同。 但你不是在写这些语言。 Java就是这样。

使用getter和setter而不是公共字段有很多原因。 我在SO中发现的是

因为从现在起2周(几个月,几年),当你意识到你的setter需要做的不仅仅是设置值时,你也会意识到该属性已被直接用于其他238个类:-)

你也可以看一下这篇文章 ,它也引用了我上面给出的内容,并提供了一些其他的例子。 阅读然后您可以决定是否在您的案例中使用公共字段。

保持您的类字段为私有并使用getter / setter方法提供了一个抽象层,从长远来看,它更容易维护。 请参阅: Java的公共领域有什么用?