我不确定这是什么合适的术语,但是,我试图弄清楚如何根据用户输入创建对象的新实例。
比方说,我有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);
答案 0 :(得分:0)
您需要的是对这种逻辑使用正确的设计模式,并且您可以在此处选择的是Builder,Factory或Strategy(本文档的最后一个)这种情况实际上是一种工厂)
最简单的解决方案如下
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;
}