Java不可变类Aim的链式调用初始化实现方案问询
实现满足链式调用的不可变类Aim
嘿,搞定这个不可变类其实很简单,核心就是永远不修改原有对象的状态,所有"修改"操作都返回一个全新的实例。咱们一步步来实现符合你要求的Aim类:
不可变类的核心规则先明确
要做不可变类,得遵守几个关键点:
- 类的所有状态字段都用
private final修饰,确保对象创建后就没法改这些值 - 绝不提供修改字段的setter方法,只留读取用的getter
- 所有看似修改状态的方法(比如你的
coordinateChange和scale),都要返回新的类实例,原对象完全不动
完整代码实现
public class Aim { // 私有final字段,保证实例创建后坐标不可被修改 private final double x; private final double y; // 构造器:唯一能初始化坐标的地方 public Aim(double x, double y) { this.x = x; this.y = y; } // Getter方法:只允许读取坐标,不能修改 public double getX() { return x; } public double getY() { return y; } // 坐标加法操作:返回新的Aim实例,原实例不受影响 public Aim coordinateChange(int dx, int dy) { // 计算新坐标,然后创建并返回新实例 double newX = this.x + dx; double newY = this.y + dy; return new Aim(newX, newY); } // 坐标缩放操作:同样返回新实例 public Aim scale(double factor) { double newX = this.x * factor; double newY = this.y * factor; return new Aim(newX, newY); } // 可选:重写toString,方便打印查看结果 @Override public String toString() { return String.format("Aim(坐标=(%.1f, %.1f))", x, y); } }
验证你的调用逻辑
咱们拆解你写的链式调用:
new Aim(2,3):创建第一个实例,坐标是(2, 3).coordinateChange(2,1):基于第一个实例,算出新坐标2+2=4、3+1=4,返回新的Aim(4,4)实例.scale(0.5):基于第二个实例,缩放后得到4*0.5=2、4*0.5=2,返回最终的Aim(2,2)实例
你可以用这段测试代码验证:
public class TestAim { public static void main(String[] args) { Aim a = new Aim(2,3).coordinateChange(2,1).scale(0.5); System.out.println(a); // 输出:Aim(坐标=(2.0, 2.0)) } }
为什么这么写是对的?
因为每次调用coordinateChange或scale时,都没有修改原来的Aim对象,而是生成了一个全新的对象。这样原来的实例始终保持不变,完全符合不可变类的定义,同时链式调用的写法也能正常工作。
内容的提问来源于stack exchange,提问作者Javallion
相关产品推荐
相关产品推荐

