我有一个具有线程池的主类,许多其他类使用它来对数据库执行操作。我目前有一个getter方法来获取池,它工作正常,但似乎有点笨拙。
在什么情况下使用公共字段代替getter/setter方法是可以接受的?
保持类字段的私密性并使用getter/setter方法提供了一层抽象,并且从长远来看更容易维护。看看这个:Java的公共字段是怎么回事?
使用getter的原因有很多
因为从现在开始的2周(几个月,几年)后,当你意识到你的设置者需要做的不仅仅是设置值时,你也会意识到该属性已被直接用于238个其他类:-)
你也可以看看这篇文章,它也引用了我上面给出的内容,并提供了一些其他的例子。阅读,然后您可以决定是否在您的案例中使用公共字段。
在什么情况下使用公共字段代替getter/setter方法是可以接受的?
公共字段不好的主要原因是它们将实现暴露给外部世界。这会导致不必要的耦合;即过度依赖其他类的实现细节的类。这往往会使代码更难理解和更改。如果该字段不是Final
,您需要搜索整个代码库以确保没有任何东西“干扰”该字段。(好吧,IDE让这变得更容易......但是将公共字段与没有setter的私有字段进行对比。)
次要原因是您无法覆盖字段。一旦在超类中公开了字段,就无法在子类中执行任何操作来修改或限制其含义。(相比之下,getters和setters可以被覆盖...)
唯一可以接受“公共”字段的情况(从风格的角度来看)是声明字段的类是私有嵌套类或内部类。结果是,该字段上的所有依赖项都被限制在包含该声明的源文件中...这否定了上述问题。
更新-我忘记了<code>公共静态最终</code>…但我们倾向于根本不将其视为字段。无论如何,通常的做法是直接访问公共静态最终
字段。常量的概念是故意公开名称、类型和值……由于静态字段的性质,重写问题不适用。
我目前有一个getter方法来获取池,它工作正常,但似乎有点笨拙。
“笨拙”是一个观点/品味的问题。就我个人而言,我不认为<代码>是obj。getInstance()与<code>obj.instance</code>相比显得笨拙。这只是Java方式1。
另一方面,如果您没有getInstance()
方法,所有使用池的类都必须具有对实例
字段的硬编码引用。如果(由于某些原因)您需要更改有关访问池的方式的某些内容(例如添加安全检查、添加计数器、使池创建延迟、确保访问正确同步),那么您必须更改对字段进行编码引用的每个位置。但是使用getter,您只有一个地方可以更改。
1-显然,其他语言的做法有所不同。但你不是在写那些语言。Java就是这样。
问题内容: 在什么情况下,您将使用字段变量而不是局部变量?我发现很难决定何时在类中的2个或更多方法中使用变量。我倾向于使用局部变量,并将它们传递给另一种方法。 谢谢, 莎拉 问题答案: 用面向对象的术语来说,变量作为对象的属性有意义吗?如果是这样,则应将其设为字段变量。如果没有,它可以任意选择。 记住单一责任原则-设计良好的班级应该只承担1个责任,因此只有1个改变的理由。
问题内容: 我从jls找到了报价: 相等运算符可用于比较两个可转换(第5.1.8节)为数字类型的操作数,或两个boolean或Boolean类型的操作数,或 两个分别为引用类型或null类型的操作数 。所有其他情况都会导致编译时错误。 但是这段代码 每个操作数都是参考! 说这是不兼容的类型。 jls在哪里说这些类型应该兼容? 问题答案: 在15.21.3节(参考相等运算符==和!=)中: 如果无法
我找到了JLS引文: 表示它是不兼容的类型。 在jls中哪些地方说这些类型应该兼容?
Java 对字段具有不同的访问级别: 由于封装的概念,我们总是尝试使用<code>private</code>修饰符,以及所需访问级别的getter和setter。这个答案显示了它的各种优点。既然getter和setter很酷,我们应该在什么时候选择<code>public/protected/default对象字段 到<代码>私有对象字段 澄清:我完全理解为什么以及什么是getter、sette
问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制
当我用公共方法重写受保护的方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法?