我的目标是:能够将一组对象(在本例中为Animal)保存到光盘上。然后,我希望能够加载它们。我已经使用JSON来做到这一点,但是为了清楚起见,在此代码段中省略了它。我希望能够制作更多具有更多字段的Animal类(请参见下面的Unicorn Class)。

无法预先知道对象的类别。如何使用addAnimal输入使String工作?

AnimalWrangler aw;

void setup()
{
  aw = new AnimalWrangler();

  aw.addAnimal("cat");
  aw.addAnimal("horse");
  aw.addAnimal("unicorn");
  aw.addAnimal("unknown");
}

class AnimalWrangler
{

  ArrayList<Animal> animals;

  AnimalWrangler()
  {
    animals = new ArrayList<Animal>();
  }

  void addAnimal(String type)
  {
    //makes an animal according to type

    ///if type does not exist then throw

    //add to animals array

  }
}



class Animal
{
  String type;

  Animal()
  {
  }
}

class Cat extends Animal
{
  Animal animal;
  Cat()
  {
    animal = new Animal();
    type = "cat";
  }
}

class Horse extends Animal
{
  Animal animal;
  Horse()
  {
    animal = new Animal();
    type = "horse";
  }
}

class Unicorn extends Animal
{
  Animal animal;
  float magic_level;
  /////classes can have any number of attributes

  Unicorn()
  {
    animal = new Animal();
    type = "unicorn";
  }
}

最佳答案

典型的方法是创建一个字符串到类映射的注册表:

static Map<String, Class<? extends Animal>> registry;


然后使用以下类型填充地图:

static {
            registry = new HashMap<>();
            registry.put("cat", Cat.class);
        }


然后,对于AnimalWrangler.addAnimal("cat");添加到addAnimal方法:

animals.add(registry.get("cat").newInstance());


只要每个类都有一个默认构造函数,就可以解决它。

09-10 23:39