0

我有多个class A. 由于这些对象是游戏中使用的纹理,因此它们具有表明其用途的独特名称。例如)bttnDoor bttnPause bttnExit bttn .... 所以我不想将它们作为数组(即使我有一个数组,我也可以使用循环来初始化它们)。

我试过了

a = b = c = new Object();但由于它们是可变的,它们都指向同一个对象。

似乎唯一初始化它们的方法是

a = new Ob...


b = new Ob...


c = new Ob...

然而,随着开发的进展(更多纹理),硬编码的合唱团以指数方式扩展自身。

有没有更简单的方法来初始化具有不同对象的多个对象?

4

4 回答 4

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

这使我相信对象创建不涉及任何更改初始化参数导致我的错误答案..

于 2013-04-29T06:22:52.860 回答
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());
         }
   }
 }

编辑:我已经增强了它具有不同类型的可能性

于 2013-04-29T06:25:06.367 回答
1

不,没有关键字new,您无法创建.instanceclass

于 2013-04-29T06:16:18.857 回答
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;}
}

虽然这不能直接解决您的问题,但没有办法直接解决您的问题。另一种解决方案可能是使用纹理数组,但这会相当混乱。

在此处阅读有关枚举类型的更多信息。

于 2013-04-29T06:18:38.717 回答