我有多个class A
对象。
由于这些物体是游戏中使用的纹理,因此它们具有表明其用途的独特名称。
ex)bttnDoor bttnPause bttnExit bttn ....
所以我不想把它们变成数组(即使我有一个数组,我也可以使用循环来初始化它们。)
我试过
a = b = c = new Object();
但由于它们是可变的,它们都指向同一个对象。
似乎是区别地初始化它们的唯一方法是
a = new Ob...
b = new Ob...
c = new Ob...
然而,随着开发的进展(更多纹理),硬编码的合唱团会以指数方式扩展。
是否有更简单的方法来初始化具有独特对象的多个对象?
答案 0 :(得分:1)
号码没有new
关键字,无法创建instance
的{{1}}。
答案 1 :(得分:1)
使用enum
类型。枚举具有对此特定用途有用的语法。
您可以让所有纹理实现继承类型。然后,做一些像:
public enum Textures {
TEXA (new TextureA()),
TEXB (new TextureB());
//...
private Texture s;
public Texture getTexture() {return s;}
Textures(Texture s) {this.s = s;}
}
虽然这不能直接解决您的问题,但无法直接解决您的问题。另一个解决方案可能是使用纹理数组,但这将是相当混乱的。
详细了解枚举类型here。
答案 2 :(得分:1)
您可以使用IOC容器更轻松地完成此操作。
或者您可以使用类似下面的工厂方法来初始化变量。
public static void initializeObjects(Object... params){
for(Object obj:params){
obj=new Object();
}
}
调用它很容易
Object a;
Object b;
Object c;
initializeObjects(a,b,c);
编辑:
实际上这不起作用。我必须为这种简单的疏忽道歉。原因是新创建的实例不会反映在原始变量中。
这是因为Java通过值传递对象引用。因此,原始声明仍将指向null
。
@Telthien感谢您启动我的思路。
但是,请允许我指出,在OPs问题中,他有以下片段
a = b = c = new Object();
这使我相信对象创建不涉及任何更改的初始化参数,导致我的错误答案..
答案 3 :(得分:1)
您可以尝试使用反射。它不是推荐的,但它解决了你的问题。
import java.lang.reflect.Field;
public class Example {
Integer f1;
String f2;
Example f3;
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
Example obj = new Example();
for (Field f : Example.class.getFields()) {
f.set(obj, f.getType().newInstance());
}
}
}
编辑: 我已经增强了它可能有不同的类型