为什么Java AWT"Point"类的"x"和"y"变量可以公开访问?



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

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

1) 允许公众访问实例变量不是一种糟糕的做法吗?这个问题

2) 有更好的设计吗?

是的,这是一种糟糕的做法(至少按照今天的标准),但有几个原因。。。

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

详细信息。。。

  1. 超类Point2D是一个通用对象,用于表示可以在2D空间中表示的任何类型的点。为了最大限度地用作泛型类,该点需要允许最高级别的精度(即double)。这一点从返回doubles的getX()getY()方法中可以明显看出。通过使用doubles,它允许任何子类与这些方法兼容,因为double是具有精度的最大基元java数字类型,因此任何使用任何其他基元数值变量的子类都可以将其作为double返回,而不会丢失任何精度

    因此,您可以将Point视为Point2D的简化版本,它不保持任何精度,但它仍然必须符合超类Point2D的抽象方法声明。JVM可以直接将int转换为double,而不会丢失任何精度——如果Point2D不是double,则在转换过程中会丢失一些精度。(例如,您不能将其强制转换为float,因为较大的int值无法在不截断一些较高数字的情况下直接表示为float)

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

  3. 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,你应该简单地接受它。

最新更新