コードで次の列挙型を定義しました。
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テストを実行している場合、すべてが正常です。ただし、テストスイート全体を実行すると、以前は単独で機能していた同じテストがnullポインター例外で失敗します。これは、列挙型が正しく初期化されていないため、列挙型コンストラクターの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]
ほとんどのフィールド(フィールドも列挙型です)は、私が理解できない何らかの理由でnullですが、テストスイート全体を実行した場合に限ります。
私は完全に無知です、どんな提案も大歓迎です。
ありがとう!
私はあなたの間でクラスのロードサイクルを持っていると思うTable
とField
。
次の列挙型を検討してください。
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
ます。
このサイクルを特定し(このような長さ2のサイクルではない可能性があり、列挙型クラスが含まれるだけでなく、完全に明白ではない可能性があります。コード内の周期的な依存関係を特定するツールが存在します)、それを中断する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加