【发布时间】:2012-11-26 01:09:01
【问题描述】:
我正在编写一个表示一些简单几何图形的 Java 类。
在最顶层的abstract 类(它本身是package-private)我声明了我需要从同一个包中的子类访问的属性。
如果我在AbstractClass 中将属性声明为final,
final int foo;
我将能够直接在包中访问它,而无需大惊小怪的 getter 方法。 然而。按照“实践”(或者我认为是常见的风格)做的会是:
private final int foo;
这当然需要非private getter。子类必须引用foo(这是一个非常相关且典型的属性),就好像它是某个外部对象一样:
this.getFoo();
它添加代码并删除访问这些成员的直接方式(即foo)。
跳过private 修饰符有什么缺点,因为它们无论如何都是最终的,我不担心在包内部公开这些属性?
我知道 OO 拥护者声称 getter/setter 是对象访问其自身属性的一种非常自然的方式 - 但是这何时会使任何非装饰性、非 [插入任何 JavaBeans 样式的东西],区别?
考虑一个内部类Coordinate,它非常简单,因为它有两个int 属性 - 将所有用法留给OuterClass 类:
class OuterClass{
final static class Coordinate{
final int x, y;
Coordinate(int x, int y){
this.x = x;
this.y = y;
}
}
Coordinate coordinate;
}
对于这个内部类 - 我为什么要为创建 getter 的实践而烦恼?
getter 会引入更多代码并强制同一包中的任何类调用coordinate.getX(); 而不是简单的coordinate.x;。这里有开销吗?注意 Coordinate 类上的 final 修饰符。
【问题讨论】:
-
如果您允许从对象外部对对象的字段进行任何访问,有些人会变得很热和烦恼。对这些人来说,这很重要。对其他人来说,不。
-
@HotLicks :这实际上是我最关心的问题 :) atm 对于我的实现它当然没有意义。但我也渴望根据所有优秀的程序员实践进行相应的编码。我的意思是,因为它是最终的,所以可以访问(但是包私有)只是查看变量,而不是使用 getter - 这怎么可能是错误的?特别是在直接看时会产生不那么难看的括号。
-
担心如果类的内部结构随时间发生变化,可能需要删除直接访问并改用访问器方法。在某些情况下这是一个现实的问题(例如,广泛使用的应用程序的主要公共接口),但在大多数情况下几乎没有问题。直接方法的简单性(因此错误更少)可能很容易超过这种担忧。
-
内部结构将如何变化?我没有足够的知识来理解它是如何可能的。我的想法是,这个 AbstractClass 通过接口与规范捆绑在一起,因此有它的包私有系统(我定义)和它的公共交互(其他人可以使用)。因此,除了 package-maintaner 之外,没有其他人会受此影响——它很有帮助,因为它使抽象类的扩展更简单(在某种意义上,我可以在子类中通过简单的“foo”而不是 getFoo() 来调用它(即对我来说没有什么意义,因为子类应该感觉 foo 是“他的”)
-
内部可能会发生变化,例如,如果类被更改为在远程数据库而不是本地数据库上操作,或者应用程序被概括为数字(也许是权重)在您的首选单位(磅与千克),同时内部仍以千克为单位。但在“现实生活”中,无需因其他原因重新设计界面而进行此类更改的几率非常低。