如何在Java枚举的同一项中引用自身属性?
问题解决:Java枚举中基于size属性生成exampleValue的简洁实现
你的核心问题是枚举实例初始化阶段属于静态上下文,此时this还未完成初始化,无法调用实例方法。以下几种符合Java风格的简洁解决方案:
方案一:构造器内直接计算(推荐)
直接在构造器中利用传入的size参数生成exampleValue,无需在枚举项定义时引用this:
private enum FIELDS { FIELD_2("Field 1", 1, 8), FIELD_3("Field 2", 2, 7), FIELD_4("Field 3", 3, 9); private final String description; private final int number; private final int size; private final String exampleValue; FIELDS(String description, int number, int size) { this.description = description; this.number = number; this.size = size; // 直接用构造参数size生成exampleValue this.exampleValue = StringUtils.leftPad("A", size, "X"); } public String getDescription() { return description; } public int getNumber() { return number; } public int getSize() { return size; } public String getExampleValue() { return exampleValue; } }
这种方式最直接,完全符合Java枚举的初始化逻辑,代码简洁且可读性高。
方案二:静态方法封装生成逻辑
如果exampleValue的生成逻辑复杂,可以用私有静态方法封装,避免构造器代码臃肿:
private enum FIELDS { FIELD_2("Field 1", 1, 8), FIELD_3("Field 2", 2, 7), FIELD_4("Field 3", 3, 9); private final String description; private final int number; private final int size; private final String exampleValue; FIELDS(String description, int number, int size) { this.description = description; this.number = number; this.size = size; this.exampleValue = generateExampleValue(size); } // 私有静态方法封装生成逻辑,便于复用和维护 private static String generateExampleValue(int size) { return StringUtils.leftPad("A", size, "X"); } // getter方法不变 public String getDescription() { return description; } public int getNumber() { return number; } public int getSize() { return size; } public String getExampleValue() { return exampleValue; } }
方案三:延迟初始化(适用于高成本计算场景)
如果exampleValue计算成本高且不常被访问,可以用延迟初始化方式,避免枚举加载时的不必要计算:
private enum FIELDS { FIELD_2("Field 1", 1, 8), FIELD_3("Field 2", 2, 7), FIELD_4("Field 3", 3, 9); private final String description; private final int number; private final int size; private volatile String exampleValue; // volatile保证可见性 FIELDS(String description, int number, int size) { this.description = description; this.number = number; this.size = size; } public String getExampleValue() { String value = exampleValue; if (value == null) { synchronized (this) { value = exampleValue; if (value == null) { exampleValue = value = StringUtils.leftPad("A", size, "X"); } } } return value; } // 其他getter方法不变 public String getDescription() { return description; } public int getNumber() { return number; } public int getSize() { return size; } }
总结
优先选择方案一,它是最简洁高效的实现方式,完全匹配你的需求;如果生成逻辑复杂,再考虑方案二;方案三仅适用于计算成本极高的特殊场景,大多数情况下无需使用。
内容的提问来源于stack exchange,提问作者AndreasInfo
相关产品推荐
相关产品推荐

