2016-10-14 9 views
3

非常に奇妙な行動:Javaの列挙は、私は私のコードに次の列挙型を定義した

私は列挙型のすべてのものを使用して、単一のJUnitテストを実行しています
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); 
    } 

} 

で結構です。しかし、私は、全体のテストスイートを実行すると、分離で働いていた同じテストを前にNULLポインタ例外で失敗し、原因を正しく初期化されbeeingていない列挙型に、列挙型のコンストラクタ内の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ですが、私が理解できないのは、テストスイート全体を実行した場合のみです。

私は完全に無知ですが、どんな提案も大歓迎です。

ありがとうございます!

+0

これはスレッドの問題のように聞こえます(しかし、なぜか分かりません)。フィールド(名前、親和性およびフィールド)を最終的に問題を解決するかどうか確認しようとしましたか? – assylias

+0

テストを見ることなく確実に言うのは難しいですが、次のテストで正しくリセットされていない状態やリソースを共有しているように聞こえます。 –

+0

フィールドとは何ですか?それは 'テーブル'を含んでいますか? – AxelH

答えて

4

TableFieldの間のクラスローディングサイクルがあると思います。

次のenum考えてみましょう:

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ための参照BBがロードされますAロードを。 BAを参照し、Aがロードされます。ただし、既にロードされていることを除いて、Zを構築するときは初期化されていないフィールド値(null)が表示されます。あなたはこのサイクルを識別するために必要

Ideone demo

(それは、このような長さ2のサイクルではないかもしれない、と列挙型クラスを含むことができるだけでなく、それは完全に明白ではないかもしれません。ツールは循環的な依存関係を特定するために存在しますコード内で)それを壊す。

0

上記のコードを実行しようとしましたが、フィールドが列挙型(ここに添付されている)であると仮定すると、完璧に動作しました。

public class Runner {  
    public static void main(String[] args) { 
     System.out.println(Table.BASE_PRICES); 

    }  
} 


public enum Field { 
    BILLING_WEIGHT_LOWER_BOUND, BILLING_WEIGHT_UPPER_BOUND, BASE_PRICE, SERVICE_TYPE_ID, ZONE_ID, 
    COUNTRY_CODE, SERVICE_TYPE, COUNTRY_CODE_ID, POST_CODE_LOWER_BOUND, POST_CODE_UPPER_BOUND, ZONE_CODE; 

} 

ENUMコンストラクター(base_prices): [BILLING_WEIGHT_LOWER_BOUND、BILLING_WEIGHT_UPPER_BOUND、BASE_PRICE、SERVICE_TYPE_ID、ZONE_ID]

ENUMコンストラクター(country_codes): [COUNTRY_CODE]

それは次のコードを使用して所望の出力を生成しました

ENUMコンストラクタ(service_types): [SERVICE_TYPE]

ENUMコンストラクタ(zone_division): [COUNTRY_CODE_ID、SERVICE_TYPE_ID、ZONE_ID、POST_CODE_LOWER_BOUND、POST_CODE_UPPER_BOUND]

ENUM CONSTRUCTOR(ゾーン): [ZONE_CODE]

あなたがここに別の何かをやっているなら、私に教えてください。

関連する問題