2

我正在对图像进行一些处理,并在我的工作中使用 package java.awt.geom。我正在使用类Point。此类扩展Point2D并继承了返回 double 的 get 方法。Point是一个点的整数表示。

要访问其中的整数xy值,Point您需要使用可公开访问的变量xy;我的问题是

1) 允许公共访问实例变量不是不好的做法吗?例如。这个问题

2)有没有更好的设计?

4

2 回答 2

4

是的,这是不好的做法(至少按照今天的标准),但这有几个原因......

  1. 超类Point2D需要尽可能通用
  2. 向后兼容
  3. 方便

详细地...

  1. 超类Point2D是一个通用对象,用于表示可以在 2D 空间中表示的任何类型的点。为了最大限度地用作泛型类,该点需要允许尽可能高的精度(即 a double)。这通过返回s的getX()andgetY()方法很明显。double通过使用doubles,它允许任何子类与这些方法兼容,因为 double 是具有精度的最大原始 Java 数字类型,因此任何使用任何其他原始数值变量的子类将始终能够将其返回为adouble不失任何精度。

    因此,您可以将其Point视为的简化版本Point2D,这不保持任何精度 - 但是它仍然必须符合超类的抽象方法声明Point2D。JVM 可以直接将Anint转换为 adouble而不会丢失任何精度 - 如果Point2D不是 a double,您将在转换期间丢失一些精度。(例如,您不能将其强制转换为 a float,因为较大的int值将无法直接表示为 afloat而不砍掉一些较高的数字)

  2. Point 类是在 Java 1.0 中引入的。为了保持向后兼容性,需要保持对这些变量的访问,即使这可能不是最佳实践。您会在其他早期课程中注意到这一点,例如变量File.separator

  3. Point是一个在很多地方使用的类,它本身仍然是一个非常通用的对象。程序员直接引用 anint比每次想要获取 value 时都要强制转换要容易/简单/快捷得多(int)getX()。JVM 处理它也更快,因为它不需要将 an 转换int为 a double,然后再转换回a int

如果您想要更好的设计,您可能最好创建额外的方法来访问int值作为ints - 即创建方法getXInt()and getYInt(),然后将变量更改回非公共(前提是您不需要保留向后兼容性)。

于 2012-11-14T12:28:07.210 回答
1

1)是的,这是不好的做法。Point 是在 JDK 1.0 中引入的,Java 总是试图保持向后兼容性,这就是我认为过去没有改变的原因。

x和有吸气剂y。由于Point2D. 这不是很好,但可以安全地转换为 an int,因为返回的 Point 的值实际上是一个int.

2)如果您需要处理 AWT,您应该简单地接受这一点。

于 2012-11-14T12:18:16.183 回答