如何根据用户输入创建新对象?

时间:2019-08-30 10:24:50

标签: java object arraylist

我不确定这是什么合适的术语,但是,我试图弄清楚如何根据用户输入创建对象的新实例。

比方说,我有5个不同的对象类,而我将只需要全部或某些类中的5个对象,那么某个类中我可能有多个,而没有一个。我该写些什么来创建所有或某些这些对象的新实例?

此外,我需要在没有用户输入的情况下将新对象字段设置为特定参数,并且我需要同时创建一个ArrayList

以下是1个这样的对象和数组列表的示例,我可能需要根据具有以下确切字段的用户输入来生成:

ArrayList<Item> rangerInv0 = new ArrayList<Item>();    
Ranger rangerObj0 = new Ranger("Ranger", 100, 4, 10, rangerInv0);

有没有办法做到这一点?这叫什么?

我也希望避免这种情况

if (resp == 1){
  if (rangerCount == 0){
      ArrayList<Item> rangerInv0 = new ArrayList<Item>();    
      Ranger rangerObj0 = new Ranger("Ranger", 100, 4, 10, rangerInv0);

      rangerObj0.pickUp(mh1000);
      rangerObj0.pickUp(s1000);
      rangerObj0.pickUp(t1000);

      rangerObj0.equip(mh1000);
      rangerObj0.equip(s1000);
      rangerObj0.equip(t1000);

      playerUnits.add(rangerObj0);
      playerUnitsCount++;
      rangerCount++;
      }
      else if (rangerCount == 1){
      ArrayList<Item> rangerInv1 = new ArrayList<Item>();    
      Ranger rangerObj1 = new Ranger("Ranger", 100, 4, 10, rangerInv1);

      rangerObj1.pickUp(mh1000);
      rangerObj1.pickUp(s1000);
      rangerObj1.pickUp(t1000);

      rangerObj1.equip(mh1000);
      rangerObj1.equip(s1000);
      rangerObj1.equip(t1000);

      playerUnits.add(rangerObj1);
      playerUnitsCount++;
      rangerCount++;
      }
      else if (rangerCount == 2){
      ArrayList<Item> rangerInv2 = new ArrayList<Item>();    
      Ranger rangerObj2 = new Ranger("Ranger", 100, 4, 10, rangerInv2);

      rangerObj2.pickUp(mh1000);
      rangerObj2.pickUp(s1000);
      rangerObj2.pickUp(t1000);

      rangerObj2.equip(mh1000);
      rangerObj2.equip(s1000);
      rangerObj2.equip(t1000);

      playerUnits.add(rangerObj2);
      playerUnitsCount++;
      rangerCount++;
      }
    } 

有没有一种方法可以通过变量或某种计数器来更新对象和ArrayList名称?

如果我可以做这样的事情,那会很酷,但是到目前为止,我还没有找到一种方法来完成这项工作:

int rangerCount = 0;
String rangerInvNum = ("rangerInv" + rangerCount);
String rangerObjNum = ("rangerObj" + rangerCount);

ArrayList<Item> rangerInvNum = new ArrayList<Item>();    
Ranger rangerObjNum = new Ranger("Ranger", 100, 4, 10, rangerInvNum);

3 个答案:

答案 0 :(得分:0)

您需要的是对这种逻辑使用正确的设计模式,并且您可以在此处选择的是BuilderFactoryStrategy(本文档的最后一个)这种情况实际上是一种工厂)

最简单的解决方案如下

public interface Item {}

public class Ranger implements Item {
    // ...
}

// ...

public class CommonCreationProperties {
    // All the fields user can popularne
}

public class ItemFactory{
    public Item createItem(CommonProperties properties)
        if(isRanger(properties)) {
            return new Ranger(properties.getType(), ...); // Event better introduce builder here
        } else if(is...) {
             return ...
        }
    }

    private boolean isRanger(CommonProperties properties) {
        return "Ranger".equals(properties.getType());
    }

    // ...
}

当然,提供一些特殊的type字段来识别提供的Item用户类型是一种选择-您可以实现另一种机制-唯一的事情是,使用这种方法,您的商品应该具有Item之类的通用界面,许多实现取决于您需要的物品类型

答案 1 :(得分:0)

您可以尝试使用开关盒:

String className = "user input here"
switch(className) {
  case "Ranger": {
    Ranger myRanger = new Ranger();
    ArrayList<Item> rangerInv0 = new ArrayList<Item>();
    break;
    }
  case "otherClass": {
    OtherClass myObj = new OtherClass();
    ArrayList<Item> otherClassInv0 = new ArrayList<Item>();
    break;
    }
case "....": {
    // ....
    break;
    }
  default: {
    // print error message, end program, ...
    }
}

答案 2 :(得分:0)

  • 这将为您提供帮助
  • 您无需创建对象类型和一对一变量,就可以 使用一些像我已经实现的泛型

public class Ranger<E> {

    private  String objectName;
    private Type val1;
    private Type val2;
    private Type val3; // here you can set any kind of typs ex, int,string 
    private E[] rangerInv0; // you can set any kind of array 

    public Ranger(String objectName, Type val1, Type val2, Type val3, E[] rangerInv0) {
        super();
        this.objectName = objectName;
        this.val1 = val1;
        this.val2 = val2;
        this.val3 = val3;
        this.rangerInv0 = rangerInv0;
    }