java - 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);
}
有什么理由选择一个而不是另一个吗?两者之间有什么区别吗?据我所知,他们的行为是相同的,所以任何差异都必须是他们的效率,或者他们作为程序员工作的难易程度。
解决方案
使用静态方法可以防止两件事:
- 用大多数模拟框架模拟类
- 覆盖子类中的方法
根据具体情况,这些事情可能没问题,但从长远来看,它们也会造成严重的悲痛。
因此,就我个人而言,我只在有充分理由这样做时才使用静态。
尽管如此,鉴于问题中的特定 Point2D 类,我倾向于实际使用静态方法。这个类闻起来应该具有“值”语义,以便相同坐标的两个点相等并且具有相同的哈希码。我也看不出你会如何有意义地扩展这个类。
例如想象一个 Matrix2D 类。在那里考虑子类可能很有意义,例如 SparseMatrix。然后,很可能,您会想要覆盖计算密集型方法!
推荐阅读
- python - 替换大型 Pandas 数据框中的列值
- c - 找不到 aes-128 加密密钥
- angular - 如何在没有重复存储对象的情况下在多个状态模型之间进行交互 - NGXS
- mysql - SQL:选择关系列为空的行
- node.js - 如何运行旧版本的灯塔审计?
- linux - (DPDK) 有没有办法让以太网设备立即发送数据包?
- php - 与 PHP 7.3>7.4 不同的行为,加载抽象类和 spl_autoload_register
- angular - Angular - 来自数组的数据未显示在模板中
- r - 如何在R中对字符串进行子集化
- java - Java:缺少返回语句错误?(可能很容易修复......)