Java::轻松初始化多个静态对象

Java::轻松初始化多个静态对象,java,initialization,Java,Initialization,我有多个A类对象。 因为这些物体是游戏中使用的纹理,所以它们有独特的名称来表示它们的用途。 ex)bttn门bttn暂停bttn出口bttn。。。。 所以我不想让它们成为数组(即使我有一个数组,我也可以使用循环来初始化它们) 我试过了 a=b=c=newobject()

我有多个
A类对象
。 因为这些物体是游戏中使用的纹理,所以它们有独特的名称来表示它们的用途。 ex)bttn门bttn暂停bttn出口bttn。。。。 所以我不想让它们成为数组(即使我有一个数组,我也可以使用循环来初始化它们)

我试过了

a=b=c=newobject()
看来唯一能区别地初始化它们的方法是

a = new Ob...


b = new Ob...


c = new Ob...
然而,硬编码的唱诗班随着开发的进展呈指数级扩展(更多纹理)


有没有一种更简单的方法可以用不同的对象初始化多个对象?

否。没有
新建
关键字,您无法创建
类的
实例

否。没有
新建
关键字,您无法创建

使用
枚举
类型。枚举具有用于此特定目的的语法

可以让所有纹理实现继承的类型。然后,做一些类似的事情:

public enum Textures {
    TEXA (new TextureA()),
    TEXB (new TextureB());
    //...

    private Texture s;
    public Texture getTexture() {return s;}

    Textures(Texture s) {this.s = s;}
}
虽然这不能直接解决您的问题,但也没有办法直接解决您的问题。另一个解决方案可能是使用一组纹理,但这将相当混乱


阅读有关枚举类型的详细信息。

使用
enum
类型。枚举具有用于此特定目的的语法

可以让所有纹理实现继承的类型。然后,做一些类似的事情:

public enum Textures {
    TEXA (new TextureA()),
    TEXB (new TextureB());
    //...

    private Texture s;
    public Texture getTexture() {return s;}

    Textures(Texture s) {this.s = s;}
}
虽然这不能直接解决您的问题,但也没有办法直接解决您的问题。另一个解决方案可能是使用一组纹理,但这将相当混乱


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

您可以使用IOC容器更轻松地完成此操作

或者,您可以使用下面的工厂方法来初始化变量

public static void initializeObjects(Object... params){
   for(Object obj:params){
    obj=new Object();
   }
}
打电话很容易

Object a;
Object b;
Object c;

initializeObjects(a,b,c);
编辑:

其实这是行不通的。我必须为这么简单的疏忽道歉。原因是新创建的实例不会反映在原始变量中

public static void initializeObjects(Object... params){
   for(Object obj:params){
    obj=new Object();
   }
}
这是因为Java按值传递对象引用。因此,原始声明仍将指向
null

@谢谢你让我开始思考这个问题

不过,让我指出,在这个问题上,他有以下几段话

a = b = c = new Object();

这让我相信,对象创建没有涉及任何更改初始化参数,从而导致我的答案有缺陷。

您可以使用IOC容器更轻松地完成此操作

或者,您可以使用下面的工厂方法来初始化变量

public static void initializeObjects(Object... params){
   for(Object obj:params){
    obj=new Object();
   }
}
打电话很容易

Object a;
Object b;
Object c;

initializeObjects(a,b,c);
编辑:

其实这是行不通的。我必须为这么简单的疏忽道歉。原因是新创建的实例不会反映在原始变量中

public static void initializeObjects(Object... params){
   for(Object obj:params){
    obj=new Object();
   }
}
这是因为Java按值传递对象引用。因此,原始声明仍将指向
null

@谢谢你让我开始思考这个问题

不过,让我指出,在这个问题上,他有以下几段话

a = b = c = new Object();

这让我相信,对象创建没有涉及任何改变的初始化参数,从而导致我的答案有缺陷。

您可以尝试使用反射。这是不推荐的,但它解决了您的问题

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());
         }
   }
 }
编辑:
我对它进行了增强,可以使用不同的类型

您可以尝试使用反射。这是不推荐的,但它解决了您的问题

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());
         }
   }
 }
编辑:
我对它进行了增强,可能会有不同的类型

我希望纹理的数量不会以指数形式增加,相反。随着游戏的增加,我希望你在重复使用现有纹理的同时,每个额外部分添加的新纹理数量会减少。因为这是2d游戏,我们对不同的怪物、块等有不同的纹理,但我猜如果我们设法重复使用它们,听起来我们应该这样做,我不应该有这个问题?我希望纹理的数量不会呈指数级增长-恰恰相反。随着游戏的增加,我希望你在重复使用现有纹理的同时,每个额外部分添加的新纹理数量会减少。因为这是2d游戏,我们对不同的怪物、块等有不同的纹理,但我猜如果我们设法重复使用它们,听起来我们应该这样做,我不应该有这个问题?但是。。难道我不应该写TexA(new TextureA())、B(new TextureA())、C(new TextureA())、D(new TextureA())。。。等等我看不出做a=新纹理()有什么区别;是的,你必须这样做。如果要通过对象名称引用内部纹理,则必须在某个位置指定对象名称和对象本身。枚举只是让它更友好,但仍然。。难道我不应该写TexA(new TextureA())、B(new TextureA())、C(new TextureA())、D(new TextureA())。。。等等我看不出做a=新纹理()有什么区别;是的,你必须这样做。如果要通过对象名称引用内部纹理,则必须在某个位置指定对象名称和对象本身。枚举只是让它更友好。????我很困惑。一旦obj超出范围,它不应该消失吗?我尝试了Objects[]arr=new Objects[]{a,b,c},然后在为每个对象分配新对象时循环它们,但没有成功?是的,它超出了范围。。。如果对象a是在同一范围内创建/定义的,但我有一个全局变量a存在于该范围之外,那么这种方法可能会起作用。这假设对象都是同一类型的,而它们显式不是。这是错误的,因为对象指针的a副本被发送到方法。因此,改变物体本身不会改变原创性