gpt4 book ai didi

java - 替代反射以生成随机子类的对象

转载 作者:行者123 更新时间:2023-11-29 08:44:45 25 4
gpt4 key购买 nike

我有一个 Java 程序的问题。我的程序有一个接口(interface) Bonus 和九个扩展 Bonus 的子类。我必须生成 Bonus 的随机实例并且我不能使用原型(prototype)模式,因为每个奖金都有一个随机数量,所以我必须在每次需要时创建奖金。

switch 语句和 if else 不是解决方案,因为我的子类太多,代码会很长很粗糙。

所以我决定使用反射,它对我来说非常好,但我的教授对我说反射是个坏把戏,因为它不是类型安全的,每次我更改奖励子类的名称时,我都必须更改我的类(class) GenerateBonus 中的代码。

我在网上搜索过,没有找到适合我的解决方案。那么有人知道反射的替代方法来生成随机子类的对象吗?

最佳答案

你需要两件事:

  1. 如果您想随机选择一个项目(在您的情况下是一个子类),则必须有某个地方包含有关所有可能项目的信息。
  2. 选择子类后如何创建所需实例的方法。

对于创作,如果您不能使用原型(prototype),我会使用 Supplier 或工厂。以下是供应商的示例:

    ArrayList<Supplier<Bonus>> bonuses = new ArrayList<>();
bonuses.add(Bonus1::new);
// ...
bonuses.add(Bonus9::new);
int randomNumber = generateRandomNumber(bonuses.size());
Bonus randomBonus = bonuses.get(randomNumber).get();

对于第一个问题,即获取所有可能的奖金列表,您可以像上面的示例一样简单地将它们添加到集合中,创建一个包含所有值的枚举等。

这是一个枚举示例:

enum AllBonuses{
Bonus1(BonusClass1::new),
// ...
Bonus9(BonusClass9::new);

private final Supplier<Bonus> bonus;
AllBonuses(Supplier<Bonus> bonus) { this.bonus = bonus; }
public Bonus create() { return bonus.get(); }
}

// Usage:
int randomNumber = generateRandomNumber(AllBonuses.values().length);
Bonus randomBonus = AllBonuses.values()[randomNumber].create();

我不会使用反射。除非别无他法,否则反射(reflection)很少是一个好的解决方案。


更新:如果您出于某种原因无法使用供应商(例如,您没有 Java 8),您可以使用良好的旧工厂模式:

class Bonus1Factory implements BonusFactory {
@Override
public Bonus create() { return new BonusClass1(); }
}
// ...
ArrayList<BonusFactory> bonuses = new ArrayList<>();
bonuses.add(new Bonus1Factory());
// ...

关于java - 替代反射以生成随机子类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37149464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com