如何创建通用方法替代重复的对象定位方法?
完全可行,用函数式接口+通用方法就能搞定这类重复代码
你的场景是典型的重复逻辑抽离,核心是把「创建不同实体」这个差异化逻辑单独封装,交给通用方法去调用。下面是具体实现步骤:
第一步:写通用的定位逻辑方法
把找空位置、设置实体到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));
额外优化建议
- 确保所有实体类都实现同一个父接口(比如
Fieldable),这样泛型的边界约束能避免类型错误 - 原来的布尔变量(比如
magicanIsCreated)完全是多余的,直接用while(true)加return就能终止循环,代码更简洁
内容的提问来源于stack exchange,提问作者Morozov 310
相关产品推荐
相关产品推荐

