首页 > 解决方案 > Java中的不可变数据 - 静态或实例运算符?

问题描述

想象一下任何完全不可变的 Java 类。我将使用以下示例:

public class Point2D {
  public final int x;
  public final int y;

  public Point2D(final int x, final int y) {
    this.x = x;
    this.y = y;
  }
}

现在考虑在这个类上添加一个运算符:一个方法,它接受一个或多个实例Point2D,并返回一个新的Point2D

这有两种可能性 - 静态方法或实例方法:

public static Point2D add(final Point2D first, final Point2D second) {
  return new Point2D(first.x + second.x, first.y + second.y);
}

或者

public Point2D add(final Point2D other) {
  return new Point2D(this.x + other.x, this.y + other.y);
}

有什么理由选择一个而不是另一个吗?两者之间有什么区别吗?据我所知,他们的行为是相同的,所以任何差异都必须是他们的效率,或者他们作为程序员工作的难易程度。

标签: javastaticimmutability

解决方案


使用静态方法可以防止两件事:

  • 用大多数模拟框架模拟类
  • 覆盖子类中的方法

根据具体情况,这些事情可能没问题,但从长远来看,它们也会造成严重的悲痛。

因此,就我个人而言,我只在有充分理由这样做时才使用静态。

尽管如此,鉴于问题中的特定 Point2D 类,我倾向于实际使用静态方法。这个类闻起来应该具有“值”语义,以便相同坐标的两个点相等并且具有相同的哈希码。我也看不出你会如何有意义地扩展这个类。

例如想象一个 Matrix2D 类。在那里考虑子类可能很有意义,例如 SparseMatrix。然后,很可能,您会想要覆盖计算密集型方法!


推荐阅读