JAVA中不同类型枚举的getCode

getCode of Enum of different types in JAVA

如何在枚举中存储不同的类型并在不需要转换的情况下访问它们?

public enum PlugsEnum {

    LOCAL_DATE(LocalDate.of(9999,12,31)),
    
    CONTRACTORNAME("autoname");

    @Getter
    private final Object code;

    PlugsEnum(Object code) {
        this.code = code;
    }

}

LocalDate localDate = (LocalDate) PlugsEnum.LOCAL_DATE.getCode()

枚举是一组有限的相同类型的命名对象

您误解了 Java 中枚举的用途。正如 Java Language Specification 中所述,枚举“定义了一小组命名的 class 实例”。所以枚举中命名的所有对象必须属于同一类型。该类型是声明它们的 Enum subclass。

例如:

  • enum Rgb { RED , GREEN , BLUE }
  • enum CountryInUk { ENGLAND , NORTHERN_IRELAND , SCOTLAND , WALES }
  • enum Flavor { VANILLA , CHOCOLATE , STRAWBERRY }

Enum 子class 中的每个命名对象都是同一类型。因此,您添加的任何成员 属性 都将出现在每个命名对象中。

在下一个示例中,我们将 String 类型的成员 属性 hex 添加到上面看到的每个 Rgb 枚举对象。

enum Rgb { 
    RED( "FF0000" ) , GREEN( "00FF00" ) , BLUE( "0000FF" ) ;
    private String hex ; // Hexadecimal representation. 
    private Rgb( String hex ) { this.hex = hex ; } ;
    public String getHex() { return this.hex ; }
}

关联对象的方式

如果您想通过名称将各种对象关联在一起,请使用 Java 的其他功能。

您可以定义一个 Map 来跟踪 key-value 对的集合。参见 Oracle tutorial

Map< String, LocalDate > contracts = new HashMap<>() ;
contracts.put( someContractorName , someHireDate ) ;
contracts.put( otherContractorName , otherHireDate ) ;

或者定义一个 class 来将各个部分放在一起。如果 class 的主要目的是透明且不可变地传输数据,请将 class 定义为 record.

record Contract ( String contractorName , LocalDate whenHired ) {}
Contract pavement = new Contract ( "Acme Pavement Company" , LocalDate.of( 2023, Month.JANUARY , 23 ) ) ;