有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

所以我创建了一个名为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”是列表中的缓存字符串。别介意

我唯一的问题是我想让其他人能够将自己的进程添加到enum类中,这样就不会有人被限制在我自己的进程和我自己的进程中。 这可能吗

换句话说,是否可以通过API将枚举添加到此中?我应该包括什么方法,允许其他开发人员访问enum类并向其中添加他们自己的进程


共 (2) 个答案

  1. # 1 楼答案

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

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

    public interface Parameter {
        public void process(Entity entity, Object obj, YamlConfiguration yml, String module);
    }
    
    
    // Somewhere else
    Map<String, Parameter> parameters = ... // Initialise it with yours, allow the user to add their own
    
    parameters.get(param.getKey()).process(entity, param.getValue(), yml, module);
    
  2. # 2 楼答案

    枚举不可扩展。但您可以简单地回退到基本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) {
                 ...
            }
        }
    
        ...
    }