如何允许其他人通过API向类添加自定义枚举

时间:2016-02-18 16:28:26

标签: java enums

所以我创建了一个名为properties的类,其中一部分就是这样(因为重复次数而被剪断)

public enum Parameters {
SET_CUSTOM_NAME {
    public void process(Entity entity, Object obj, YamlConfiguration yml, String module) {
        entity.setCustomName(ChatColor.translateAlternateColorCodes('&', String.valueOf(obj)));
    }
},
SET_CUSTOM_NAME_VISIBLE {
    public void process(Entity entity, Object obj, YamlConfiguration yml, String module) {
        entity.setCustomNameVisible((boolean) obj);
    }
},
SET_NO_AI {
    public void process(Entity entity, Object obj, YamlConfiguration yml, String module) {
        NBTUtils.addEntityTag(entity, "NoAI", (boolean) obj);
    }
},
SET_SILENT {
    public void process(Entity entity, Object obj, YamlConfiguration yml, String module) {
        NBTUtils.addEntityTag(entity, "Silent", (boolean) obj);
    }
}
{...};

public abstract void process(Entity entity, Object obj, YamlConfiguration yml, String module);

}

通过以下方式调用这些参数:

Parameters.valueOf(param.getKey().toUpperCase()).process(entity, param.getValue(), yml, module);

^“param”是列表中的缓存字符串。不介意。

我唯一的问题是我想让其他人能够将他们自己的进程添加到枚举类中,这样就没有人只限于我自己和我自己的进程。 这可能吗?

换句话说,是否可以通过API为此添加枚举?我应该在哪个方法中包含允许其他开发人员访问枚举类并向其添加自己的进程的方法?

2 个答案:

答案 0 :(得分:2)

枚举应该代表一组完整的值。你永远不会在运行时添加到anum,这与定义相矛盾。

对于您想要做的事情,您可以改为定义一个接口,并为实现保存名称的映射:

Scanner

答案 1 :(得分:1)

枚举不可扩展。但您可以简单地回退到基本的OO:定义一个抽象类,按名称跟踪类的所有实例,并为所有已知用例创建实例:

public abstract class Parameters {
    private static final HashMap<String,Parameters> map = new HashMap<>();
    private String name;

    public static Parameters valueOf(String name) {
         return map.get(name);
    }

    public Parameters(String  name) {
         this.name = name;
         map.put(name, this);
    }

    public String name() { return name; }

    public abstract void process(Entity entity, Object obj, YamlConfiguration yml, String module);

    public static final Parameters SET_CUSTOM_NAME = new Parameters("SET_CUSTOM_NAME") {
        public void process(Entity entity, Object obj, YamlConfiguration yml, String module) {
             ...
        }
    }

    ...
}