Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中打印所有枚举值?_Java_Enums - Fatal编程技术网

如何在Java中打印所有枚举值?

如何在Java中打印所有枚举值?,java,enums,Java,Enums,我知道在enum中可以获得这些信息 如何打印所有枚举值,如:print.generalInformation 这将产生: 名称 教育 电子邮件 电话 如何在另一个函数中将枚举一般信息作为参数传递 首先,我将重构枚举以在构造函数参数中传递字符串表示。代码在底部 现在,要打印所有枚举值,只需使用以下命令: enum generalInformation { NAME { @Override public String toString() {

我知道在enum中可以获得这些信息

  • 如何打印所有枚举值,如:
    print.generalInformation
  • 这将产生:

    名称
    教育
    电子邮件
    电话

  • 如何在另一个函数中将枚举
    一般信息
    作为参数传递
    
    首先,我将重构枚举以在构造函数参数中传递字符串表示。代码在底部

    现在,要打印所有枚举值,只需使用以下命令:

    enum generalInformation {
        NAME {
            @Override
            public String toString() {
                return "Name";
            }
        },
        EDUCATION {
            @Override
            public String toString() {
                return "Education";
            }
        },
        EMAIL {
            @Override
            public String toString() {
                return "Email";
            }
        },
        PROFESSION {
            @Override
            public String toString() {
                return "Profession";
            }
        },
        PHONE {
            @Override
            public String toString() {
                return "Phone";
            }
        }
    }
    
    使用
    EnumSet
    的替代方法是使用
    GeneralInformation.values()
    ,但这意味着每次调用它时都必须创建一个新数组,这对我来说是浪费。诚然,调用
    EnumSet.allOf
    每次也需要一个新对象。。。如果您经常这样做,并且关心性能,那么您可以随时将其缓存到某个位置

    当涉及到参数时,您可以像使用任何其他类型一样使用
    GeneralInformation

    // Note: enum name changed to comply with Java naming conventions
    for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) {
        System.out.println(info);
    }
    
    使用值调用,例如

    public void doSomething(GeneralInformation info) {
        // Whatever
    }
    

    使用构造函数参数重构

    doSomething(GeneralInformation.PHONE);
    
    使用当前的值,实际上可以自动将名称转换为标题大小写,但从长远来看,这不是很灵活,我认为这个显式版本更简单

    public enum GeneralInformation {
        NAME("Name"),
        EDUCATION("Education"),
        EMAIL("Email"),
        PROFESSION("Profession"),
        PHONE("Phone");
    
        private final String textRepresentation;
    
        private GeneralInformation(String textRepresentation) {
            this.textRepresentation = textRepresentation;
        }
    
        @Override public String toString() {
             return textRepresentation;
        }
    }
    

    你的第二部分。。。与应用程序中的
    接口

    一样,将数据与表示分离是一种很好的做法。它允许数据在不同的用户界面中使用,它使数据对象更加轻量级,并且它允许将来的应用

    记住这一点,最好避免将显示名称与枚举常量强耦合。幸运的是,有一个类使这变得简单:EnumMap

    System.out.println(java.util.Arrays.asList(generalInformation.values()));
    
    公共类应用程序i{
    私人最终地图名称;
    公共应用程序i(){
    名称=新的EnumMap(GeneralInformation.class);
    NAME.put(GeneralInformation.NAME,“NAME”);
    名称.put(一般信息.教育,“教育”);
    name.put(GeneralInformation.EMAIL,“EMAIL”);
    名称。put(一般信息。专业,“专业”);
    name.put(GeneralInformation.PHONE,“PHONE”);
    assert names.keySet().containsAll(
    EnumSet.allOf(GeneralInformation.class)):
    “忘记添加一个或多个通用信息名称”;
    }
    公共字符串getNameFor(通用信息信息信息){
    返回名称。获取(信息);
    }
    }
    
    由于Java 8我建议以下解决方案:

    public class ApplicationUI {
        private final Map<GeneralInformation, String> names;
    
        public ApplicationUI() {
            names = new EnumMap<>(GeneralInformation.class);
    
            names.put(GeneralInformation.NAME,       "Name");
            names.put(GeneralInformation.EDUCATION,  "Education");
            names.put(GeneralInformation.EMAIL,      "Email");
            names.put(GeneralInformation.PROFESSION, "Profession");
            names.put(GeneralInformation.PHONE,      "Phone");
    
            assert names.keySet().containsAll(
                EnumSet.allOf(GeneralInformation.class)) :
                "Forgot to add one or more GeneralInformation names";
        }
    
        public String getNameFor(GeneralInformation info) {
            return names.get(info);
        }
    }
    

    如果您仍然使用Java 1.7,这就是我的工作原理:

    public static String printAll() {
        return Stream.of(GeneralInformation.values()).
                    map(GeneralInformation::name).
                    collect(Collectors.joining(", "));
    }
    
    枚举上的values()返回一个数组。因此,可以简单地执行以下操作:


    System.out.println(Arrays.toString(generalInformation.values())

    您不必在每个枚举元素中重写
    toString
    方法。每个枚举都有方法name(),该方法返回调用此方法的元素的字符串表示形式:
    SomeEnum.VALUE.name()
    将返回“VALUE”字符串。您可以
    返回name().charAt(0)+name().substring(1).toLowerCase()toString()
    中的code>与此处类似。在该函数中,如何将
    generaliformation
    作为参数传递?
    String genInfoValues = "";
    boolean firstRun = true;
    for (generalInformation info : generalInformation.values()){
        if (firstRun) {
            firstRun = false;
            genInfoValues += info.name();
        } else {
            genInfoValues += ", " + info.name();
        }
    }