调用与枚举值对应的子类构造函数

时间:2014-01-12 17:40:06

标签: java enums

我有一个创建新EntityItem的方法:

    public void processEntityItem(int[] a){
        float x = Float.intBitsToFloat(a[4]);
        float y = Float.intBitsToFloat(a[5]);
        main.entitys.add(new EntityItem(EntityType.values()[a[2]], a[3], x, y, main.mr.getHieght(x, y), Float.intBitsToFloat(a[6]), a[7]));
    }

我的每个EntityItem都有一个与它们对齐的枚举(EntityType)值,构造函数中的第一个参数是枚举值。我也有一些EntityItem的子类,我想从这个方法或EntityItem的构造函数创建,这是:

    public EntityItem(EntityType type, int ID, float xCoord, float yCoord, float zCoord, float rotation, int mapID) {
        super(type, ID, xCoord, yCoord, zCoord, rotation, mapID);
    }

EntityItem构造函数的子类示例:

    public EntityArrow(int ID, float x, float y, float z, float rotation,  int mapID){
        super(EntityType.ARROW, ID, x, y, z, rotation, mapID);
        createModel();
    }

我能想到的唯一方法是切换枚举类型的所有值并调用与每个值对应的构造函数。有没有不同的方法来检查是否有一个子类对应于传递的枚举值,如果是这样调用那个子类构造函数不要求我写出每个枚举值?

2 个答案:

答案 0 :(得分:3)

如果构造函数参数始终相同,则枚举本身可以充当工厂而不是控制代码。例如:

public enum EntityType {

    ARROW {
        @Override
        public EntityItem makeEntity(
                int id,
                float x,
                float y,
                float z,
                float rotation,
                int mapId
        ) {
            // uses subclass
            return new EntityArrow(id, x, y, z, rotation, mapId);
        }
    },
    CIRCLE {
        @Override
        public EntityItem makeEntity(
                int id,
                float x,
                float y,
                float z,
                float rotation,
                int mapId
        ) {
            // uses base class
            return new EntityItem(this, id, x, y, z, rotation, mapId);
        }
    };

    public abstract EntityItem makeEntity(
            int id,
            float x,
            float y,
            float z,
            float rotation,
            int mapId
    );
}

答案 1 :(得分:0)

在超类中创建一个包含switch语句的静态工厂方法,或在枚举类型中创建多态工厂方法。