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

如何创建通用方法替代重复的对象定位方法?

完全可行,用函数式接口+通用方法就能搞定这类重复代码

你的场景是典型的重复逻辑抽离,核心是把「创建不同实体」这个差异化逻辑单独封装,交给通用方法去调用。下面是具体实现步骤:


第一步:写通用的定位逻辑方法

把找空位置、设置实体到field这些重复代码抽出来,只留一个入口让外部传入「创建实体的逻辑」:

// 泛型T表示要创建的实体类型,限定为Fieldable更安全(和field.setFieldable的类型匹配)
private <T extends Fieldable> T positionEntity(Function<Point, T> entityCreator) {
    int x, y;
    // 去掉多余的布尔变量,直接用循环+返回简化逻辑
    while (true) {
        x = random.nextInt(sizeX);
        y = random.nextInt(sizeY);
        if (field.getFieldable(x, y) instanceof Empty) {
            // 调用外部传入的逻辑创建实体
            T entity = entityCreator.apply(new Point(x, y));
            field.setFieldable(x, y, entity);
            return entity;
        }
    }
}

// 辅助类:用来封装x和y,也可以直接用两个int参数替代
private static class Point {
    public final int x;
    public final int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

第二步:用通用方法替代原来的重复方法

原来的positionMagican和positionGoblin可以直接简化成一行调用,把各自的构造逻辑用Lambda表达式传进去:

// 替代positionMagican方法
mag = positionEntity(point -> new Magician(point.x, point.y, sizeX, sizeY, field, player, this));

// 替代positionGoblin方法
goblin = positionEntity(point -> new Goblin(point.x, point.y, player, field, this, sizeX, sizeY));

备选方案:不用Point,直接传多参数

如果不想额外写Point类,也可以用BiFunction<Integer, Integer, T>来接收x和y:

private <T extends Fieldable> T positionEntity(BiFunction<Integer, Integer, T> entityCreator) {
    int x, y;
    while (true) {
        x = random.nextInt(sizeX);
        y = random.nextInt(sizeY);
        if (field.getFieldable(x, y) instanceof Empty) {
            T entity = entityCreator.apply(x, y);
            field.setFieldable(x, y, entity);
            return entity;
        }
    }
}

// 调用时的写法
mag = positionEntity((x, y) -> new Magician(x, y, sizeX, sizeY, field, player, this));
goblin = positionEntity((x, y) -> new Goblin(x, y, player, field, this, sizeX, sizeY));

额外优化建议

  1. 确保所有实体类都实现同一个父接口(比如Fieldable),这样泛型的边界约束能避免类型错误
  2. 原来的布尔变量(比如magicanIsCreated)完全是多余的,直接用while(true)加return就能终止循环,代码更简洁

内容的提问来源于stack exchange,提问作者Morozov 310

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:43:09