You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

验证你的调用逻辑

咱们拆解你写的链式调用:

  1. new Aim(2,3):创建第一个实例,坐标是(2, 3)
  2. .coordinateChange(2,1):基于第一个实例,算出新坐标2+2=4、3+1=4,返回新的Aim(4,4)实例
  3. .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:46:58