Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据用户输入创建新对象?_Java_Object_Arraylist - Fatal编程技术网

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

Java 如何根据用户输入创建新对象?,java,object,arraylist,Java,Object,Arraylist,我不确定这是什么合适的术语,但是,我正在尝试找出如何基于用户输入创建对象的新实例 假设我有5个不同的对象类,我只需要全部或部分类中的5个对象,我可能有一个以上的类,而没有其他类。我可以写些什么来创建所有或部分这些对象的新实例 此外,我需要在没有用户输入的情况下将新对象字段设置为特定参数,并且需要同时创建ArrayList 下面是一个示例,其中1个对象和arraylist I可能需要根据用户输入生成,具体字段如下: ArrayList<Item> rangerInv0 = new Ar

我不确定这是什么合适的术语,但是,我正在尝试找出如何基于用户输入创建对象的新实例

假设我有5个不同的对象类,我只需要全部或部分类中的5个对象,我可能有一个以上的类,而没有其他类。我可以写些什么来创建所有或部分这些对象的新实例

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

下面是一个示例,其中1个对象和arraylist I可能需要根据用户输入生成,具体字段如下:

ArrayList<Item> rangerInv0 = new ArrayList<Item>();    
Ranger rangerObj0 = new Ranger("Ranger", 100, 4, 10, rangerInv0);
ArrayList rangerInv0=新的ArrayList();
Ranger RangerRobJ0=新的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++;
      }
    } 
if(resp==1){
如果(rangerCount==0){
ArrayList rangerInv0=新的ArrayList();
Ranger RangerRobJ0=新的Ranger(“Ranger”,100,4,10,rangerInv0);
rangerObj0.皮卡(mh1000);
rangerObj0.皮卡(s1000);
rangerObj0.皮卡(t1000);
rangerObj0.装备(mh1000);
rangerObj0.装备(s1000);
rangerObj0.装备(t1000);
playerUnits.add(rangerObj0);
PlayerUnitScont++;
rangerCount++;
}
else if(rangerCount==1){
ArrayList rangerInv1=新的ArrayList();
Ranger rangerObj1=新的Ranger(“Ranger”,100,4,10,rangerInv1);
范围J1.捡拾器(mh1000);
范围J1.捡拾器(s1000);
范围J1.捡拾器(t1000);
rangerObj1.设备(mh1000);
装备(s1000);
测距仪J1.配备(t1000);
playerUnits.add(rangerObj1);
PlayerUnitScont++;
rangerCount++;
}
否则如果(rangerCount==2){
ArrayList rangerInv2=新的ArrayList();
Ranger rangerObj2=新的Ranger(“Ranger”,100,4,10,rangerInv2);
范围J2.捡拾器(mh1000);
范围J2.捡拾器(s1000);
范围J2.捡拾器(t1000);
rangerObj2.装备(mh1000);
装备(s1000);
测距仪J2.装备(t1000);
playerUnits.add(rangerObj2);
PlayerUnitScont++;
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);
int rangerCount=0;
字符串rangerInvNum=(“rangerInv”+rangerCount);
字符串rangerObjNum=(“rangerObj”+rangerCount);
ArrayList rangerInvNum=新的ArrayList();
Ranger RangerRobjnum=新的Ranger(“Ranger”,100,4,10,rangerInvNum);

您需要的是为这种逻辑使用适当的设计模式,您可以在这里选择的似乎是,或者(在这种情况下,最后一种是工厂)

像这样最简单的解决方案如下

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());
    }

    // ...
}

当然,提供一些特殊的
类型
字段来识别用户提供的
项目
的类型是选项之一-您可以实现另一种机制-唯一的一点是,使用这种方法,您的项目应该有一些公共接口,如
项目
,许多实现取决于项目的类型您需要的物品

您可以尝试开关盒:

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, ...
    }
}
String className=“此处用户输入”
开关(类名){
“游侠”案:{
Ranger myRanger=新的Ranger();
ArrayList rangerInv0=新的ArrayList();
打破
}
“其他类别”案例:{
OtherClass myObj=新的OtherClass();
ArrayList otherClassInv0=新的ArrayList();
打破
}
案例“…”:{
// ....
打破
}
默认值:{
//打印错误消息,结束程序。。。
}
}
  • 这对你有帮助
  • 您不需要创建对象类型和逐个变量,您可以 使用一些我已经实现的泛型

公共级护林员{
私有字符串objectName;
私有型val1;
私有型val2;
私有类型val3;//在这里可以设置任何类型的ex、int、string
private E[]rangerInv0;//您可以设置任何类型的数组
公共Ranger(字符串objectName,类型val1,类型val2,类型val3,E[]rangerInv0){
超级();
this.objectName=objectName;
这是1.val1=val1;
this.val2=val2;
this.val3=val3;
此参数为0.rangerInv0=rangerInv0;
}

看起来您需要查看构造函数是的。首先,您必须学习如何同时使用字段和构造函数。注意:从设计角度来看,您不应该将项目列表传递给Ranger。因为这允许其他代码更改Ranger中的数据。任何知道list对象的代码都可以修改考虑到给游戏者一个方法“AdditMeMe”和“ReaveItMe()”…但是不要把这个内部数据结构暴露给世界!我把对象传递给我的AARAYLIST,我可以用列表来做吗?我明白你的意思,请看我编辑的代码和我的if语句,看看这是否可以简化。

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;
    }