我正在对图像进行一些处理,在工作中我使用包java.awt.geom
。我正在使用Point
类。这个类从Point2D
扩展而来,继承了返回double的get方法。Point
是指一个点的整数表示。
要访问Point
中的整数x
和y
值,需要使用可公开访问的变量x
和y
;我的问题是
1) 允许公众访问实例变量不是一种糟糕的做法吗?这个问题
2) 有更好的设计吗?
是的,这是一种糟糕的做法(至少按照今天的标准),但有几个原因。。。
- 超类
Point2D
需要尽可能通用 - 向后兼容性
- 便利性
详细信息。。。
- 超类
Point2D
是一个通用对象,用于表示可以在2D空间中表示的任何类型的点。为了最大限度地用作泛型类,该点需要允许最高级别的精度(即double
)。这一点从返回double
s的getX()
和getY()
方法中可以明显看出。通过使用double
s,它允许任何子类与这些方法兼容,因为double是具有精度的最大基元java数字类型,因此任何使用任何其他基元数值变量的子类都可以将其作为double
返回,而不会丢失任何精度
因此,您可以将Point
视为Point2D
的简化版本,它不保持任何精度,但它仍然必须符合超类Point2D
的抽象方法声明。JVM可以直接将int
转换为double
,而不会丢失任何精度——如果Point2D
不是double
,则在转换过程中会丢失一些精度。(例如,您不能将其强制转换为float
,因为较大的int
值无法在不截断一些较高数字的情况下直接表示为float
) - Point类是在Java 1.0中引入的。为了保持向后兼容性,需要保持对这些变量的访问,即使这可能不是最佳实践。您会在其他早期类中注意到这一点,例如变量
File.separator
Point
是一个在很多地方都使用的类,它本身仍然是一个非常通用的对象。对于程序员来说,直接引用int
比每次想要获得值(int)getX()
时强制转换要容易/更简单/更快。JVM处理也更快,因为它不需要将int
转换为double
,然后再转换回int
如果您想要更好的设计,您可能最好创建其他方法来访问int
值作为int
,即创建方法getXInt()
和getYInt()
,然后将变量改回非公共的(前提是您不需要保留向后兼容性)。
1)是的,这是一种糟糕的做法。Point是在JDK1.0中引入的,Java总是试图保持向后兼容性,这就是为什么我认为这在过去没有改变的原因。
CCD_ 39和CCD_。由于Point2D
中的抽象方法声明,它们将返回一个double。这并不好,但可以安全地广播到int
,因为返回的点的值实际上是int
。
2) 如果你需要处理AWT,你应该简单地接受它。