我有一个主类,它有一个线程池,很多其他类使用它来对数据库执行操作。我目前有一个getter方法来获得工作正常的池,但看起来有点笨拙。
在任何情况下都可以使用公共字段而不是getter / setter方法吗?
答案 0 :(得分:4)
在任何情况下都可以使用公共字段而不是getter / setter方法吗?
公共领域不好的主要原因是它们将实施暴露给外界。这会导致不必要的耦合;即过分依赖于其他类的实现细节的类。这往往会使代码更难理解,更难以改变。如果字段不是final
,则需要搜索整个代码库,以确保确定没有任何内容"干扰"与该领域。 (好的,IDE会让这更容易......但是将公共字段与没有setter的私有字段进行对比。)
次要原因是您无法覆盖字段。一旦你在超类中暴露了一个字段,你就无法在子类中做任何修改或限制其含义的事情。 (相比之下,getter和setter可以被覆盖......)
唯一可以接受(从风格角度来看)公共" fields是声明字段的类是私有嵌套类或内部类的时间。结果是,对字段的所有依赖都限于包含声明的源文件...这否定了上述问题。
更新 - 我忘记了public static final
...但我们根本不会将这些视为字段。无论如何,通常的做法是直接访问public static final
字段。常量的概念是故意公开名称,类型和值......并且由于静态字段的性质,覆盖问题不适用。
我目前有一个getter方法来获取工作正常的池,但看起来有点笨拙。
"笨拙"是一个意见/品味的问题。就个人而言,我并不认为obj.getInstance()
与obj.instance
相比是笨拙的。它只是Java方式 1 。
另一方面,如果您没有getInstance()
方法,则使用该池的所有类都必须具有对instance
字段的硬编码引用。如果(由于某些原因)您需要更改有关访问池的方式(例如添加安全检查,添加计数器,使池创建延迟,确保访问正确同步),那么您必须更改每个您编码引用该字段的每个地方。但是有了吸气剂,你只需要改变一个地方。
1 - 显然,其他语言的做法不同。但你不是在写这些语言。 Java就是这样。
答案 1 :(得分:1)
使用吸气剂和吸气剂的原因有很多。 setter而不是公共领域。我在SO中找到的是
因为从现在起2周(几个月,几年),你意识到你的 setter需要做的不仅仅是设置值,你也会意识到 该物业已被直接用于其他238个类别: - )
您还可以查看this post,其中也引用了我在上面提供的内容,并提供了一些其他示例。阅读然后您可以决定是否在您的案例中使用公共字段。
答案 2 :(得分:1)
保持您的类字段为私有,并使用getter / setter方法提供了一个抽象层,从长远来看,它更容易维护。请参阅:What's the deal with Java's public fields?