【问题标题】:If my class has many children, how can I initialize an object that is a random child of my class?如果我的班级有很多孩子,我如何初始化一个我班级的随机孩子的对象?
【发布时间】:2021-03-29 11:57:05
【问题描述】:

例如。

父级:车辆 儿童:汽车、火车、马

我想做以下事情

Vehicle randVehicle = new RandomeVehicleChildObject;

我想我可以这样做:

Vehicle randVehicle;
Random r = new Random();
int x = r.nextInt();

if(x == someInt)
   randVehicle = new Car();
else if(x == otherNum)
   randVehicle = new Train();
else
   randVehicle = new Horse();

但是,如果我的班级有更多孩子怎么办?比如15还是20?我觉得写这么多 if-else 链或开关会很痛苦。有没有办法只用一行来完成?

【问题讨论】:

  • 你为什么想要一个随机选择的子类的实例?你实际上想做什么?
  • @Bohemian 好吧,例如。当你在 RPG 中制作一个新角色时,你必须选择一个起始职业:法师、战士、盗贼等。但也许你并不真正关心初始职业是什么,所以你选择“随机”按钮,然后该程序会随机为您分配一个具有其各自属性的类。
  • @BasilBourque getting the known subclasses 反射操作。它不保证返回的类具有合适的构造函数或完全可实例化,即它们可能是抽象或枚举等。如果您想要一种机制来可靠地获取给定类型的实例提供者,则必须使用(模块化)服务提供者架构。对于模块化代码,编译器已经检查了usesprovides 指令的有效性。

标签: java class random children java-15


【解决方案1】:

我建议如下:

class VehicleFactory {
    private final List<Supplier<Vehicle>> constructors = new ArrayList<>();

    public void addConstructors(Supplier<Vehicle>... constructors) {
        this.constructors.addAll(Arrays.asList(constructors));
    }

    public Vehicle make() {
        return constructors.get(random.nextInt(constructors.size()).get();
    }
}

那么当你想开始制造车辆时:

VehicleFactory factory = new VehicleFactor();
factory.addConstructora(Car::new, Horse::new, Bike::new);
Vehicle randomVehicle = factory.make();

【讨论】:

  • 我会直接初始化:... constructors = List.of(Car::new, Horse::new, Bike::new); 并废弃 add 方法。
猜你喜欢
  • 2022-01-21
  • 2013-12-24
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多