有 Java 编程相关的问题?

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

java如何使包含枚举列表的枚举常量?

最近我一直在尝试制作一个相对论能量计算器。我用List<ComponentType>来表示构建在ComponentType.ELECTRONComponentType.PROTONComponentType.NEUTRON上的任何粒子,其中ComponentType是包含enum的质量

后来我想创建一个ParticleFactory类,它将对应于GUI下拉列表中的基本粒子列表。比如:ParticleFactory(Hydrogen)会给我一个包含{ComponentType.ELECTRON, ComponentType.PROTON}列表的粒子对象。这将使修改变得容易,因为ParticleFactory和GUI将对基本粒子使用相同的enum

当我试图实现它时,问题出现了。我知道它不可能使用不正确的语法,但无论我做什么,我总是会出错

public enum GenericParticleType {

ELECTRON({"electron","e"}, new ArrayList<ComponentType>());

private final String[] names;
private final List<ComponentType> components;

GenericParticleType(String[] names, List<ComponentType> components) {
    this.names = names;
    this.components = components;
    }   
}

目标是使enum包含其他enums的列表:有没有合适的方法

有没有更好的办法?常数HashMap


共 (2) 个答案

  1. # 1 楼答案

    我认为这没有问题:

    public enum GenericParticleType {
    
        ELECTRON(new String[] { "electron", "e" },
                new ArrayList<GenericParticleType>()),
    
        MULTI_ELECTRON(new String[] { "me" }, Arrays.asList(ELECTRON, ELECTRON)),
    
        COMPOSITION(new String[] { "c" }, Arrays.asList(MULTI_ELECTRON, ELECTRON,
                ELECTRON));
    
        private final String[] names;
    
        private final List<GenericParticleType> components;
    
        GenericParticleType(String[] names, List<GenericParticleType> components) {
            this.names = names;
            this.components = components;
        }
    
        public String[] getNames() {
            return names;
        }
    
        public List<GenericParticleType> getComponents() {
            return components;
        }
    }
    
  2. # 2 楼答案

    我认为您需要以下设计:

    • 一个名为GenericParticle的接口
    • 提供最基本实现的枚举
    • 一个工厂/建筑商,在那里你可以做你想要的任何东西

    您可以通过以下代码实现这一点:

    enum Component {
        ELECTRON, PROTON, NEUTRON;
    }
    
    interface GenericParticle {
        List<String> getNames();
    
        List<Component> getComponents();
    }
    
    enum BasicGenericParticle implements GenericParticle {
        ELECTRON(
                Arrays.asList("electron", "e"),
                Arrays.asList(Component.ELECTRON)
        ),
        HYDROGEN(
                Arrays.asList("hydrogen", "h"),
                Arrays.asList(Component.ELECTRON, Component.PROTON)
        )
        ;
    
        private final List<String> names;
        private final List<Component> components;
    
        private BasicGenericParticle(final List<String> names, final List<Component> components) {
            this.names = names;
            this.components = components;
        }
    
        @Override
        public List<String> getNames() {
            return new ArrayList<>(names);
        }
    
        @Override
        public List<Component> getComponents() {
            return new ArrayList<>(components);
        }
    }
    
    class GenericParticleBuilder {
        private List<String> names = new ArrayList<>();
        private List<Component> components = new ArrayList<>();
    
        public GenericParticleBuilder name(final String name) {
            names.add(name);
            return this;
        }
    
        public GenericParticleBuilder component(final Component component) {
            components.add(component);
            return this;
        }
    
        public GenericParticle build() {
            return new GenericParticleImpl(names, components);
        }
    
        private static class GenericParticleImpl implements GenericParticle {
            private List<String> names = new ArrayList<>();
            private List<Component> components = new ArrayList<>();
    
            public GenericParticleImpl(final List<String> names, final List<Component> components) {
                this.names = names;
                this.components = components;
            }
    
            @Override
            public List<String> getNames() {
                return new ArrayList<>(names);
            }
    
            @Override
            public List<Component> getComponents() {
                return new ArrayList<>(components);
            }
        }
    }
    

    用作:

        GenericParticle electron = BasicGenericParticle.ELECTRON;
        GenericParticle hydrogen = BasicGenericParticle.HYDROGEN;
        GenericParticle water = new GenericParticleBuilder()
                .name("water").name("h2o2")
                .component(/*components*/)
                .build();
    

    您确实需要针对以下事实对您的电视机采取预防措施:

    • 非法粒子不应该是可构造的,当然,除非客户机自己实现GenericParticle,但是为此,您有文档来确保他做了正确的事情
    • 防御复制的性能不是最好的,但是您绝对希望字符串是不可变的。您可以考虑自己实现一个不可变的列表(它不可能更改列表中的元素),也可以使用库中提供的一种,如番石榴(优选)。我不会使用字符串数组,因为它们会给其他开发人员和您自己带来很多负担,我更喜欢对象