gpt4 book ai didi

Java Enum 表现得很奇怪

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:56 27 4
gpt4 key购买 nike

我在我的代码中定义了以下枚举:

public enum Table {
BASE_PRICES("base_prices", Affinity.UPS,
Arrays.asList(
Field.BILLING_WEIGHT_LOWER_BOUND,
Field.BILLING_WEIGHT_UPPER_BOUND,
Field.BASE_PRICE,
Field.SERVICE_TYPE_ID,
Field.ZONE_ID
)),

COUNTRY_CODES("country_codes", Affinity.UPS,
Arrays.asList(Field.COUNTRY_CODE)),

SERVICE_TYPES("service_types", Affinity.UPS,
Arrays.asList(Field.SERVICE_TYPE)),

ZONE_DIVISION("zone_division", Affinity.UPS,
Arrays.asList(
Field.COUNTRY_CODE_ID,
Field.SERVICE_TYPE_ID,
Field.ZONE_ID,
Field.POST_CODE_LOWER_BOUND,
Field.POST_CODE_UPPER_BOUND)),

ZONES("zones", Affinity.UPS,
Arrays.asList(Field.ZONE_CODE));

// used to denote the affinity of a table for
// affinity specific DB cleanup and other stuff.
public enum Affinity {
UPS
}

private String name;
private Affinity affinity;
private List<Field> fields;

private Table(String name, Affinity affinity, List<Field> fields){
this.name = name;
this.affinity = affinity;
this.fields = fields;
System.out.println("ENUM CONSTRUCTOR (" + name + "):");
System.out.println(fields);
System.out.println();
}

public List<Field> getFields(){
return Collections.unmodifiableList(fields);
}

}

当我使用枚举运行单个 JUnit 测试时,一切正常。但是,当我运行整个测试套件时,由于枚举未正确初始化,之前独立工作的同一测试因空指针异常而失败,枚举构造函数中 println 的输出为:

ENUM CONSTRUCTOR (base_prices):
[BILLING_WEIGHT_LOWER_BOUND, BILLING_WEIGHT_UPPER_BOUND, BASE_PRICE, null, null]

ENUM CONSTRUCTOR (country_codes):
[COUNTRY_CODE]

ENUM CONSTRUCTOR (service_types):
[null]

ENUM CONSTRUCTOR (zone_division):
[null, null, null, null, null]

ENUM CONSTRUCTOR (zones):
[null]

由于某些我不明白的原因,大多数字段(字段也是一个枚举)都是空的,但前提是我执行了整个测试套件。

我完全一无所知,非常感谢任何建议。

谢谢!

最佳答案

我认为您在 TableField 之间有一个类加载周期。

考虑以下枚举:

enum A {
X(B.Z),

A(B b) {
System.out.println("Constructing " + name() + ": " + b);
}
}

enum B {
Z(A.X);

B(A a) {
System.out.println("Constructing " + name() + ": " + a);
}
}

因为A引用了B,加载A会导致加载B;但是 B 引用 A,这会导致加载 A - 除了它已经被加载,所以你会看到未初始化的字段值( >null) 在构造 Z 时。

Ideone demo

你需要识别这个循环(它可能不是像这样的长度为2的循环,并且可能不仅涉及枚举类,所以它可能并不完全明显;存在识别代码中循环依赖的工具)并打破它.

关于Java Enum 表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40040094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com