1

以下のように、異なる例外カテゴリ Enum があります。

public enum GSBBCacheCategory  {
    SEARCH(9001),
    UPDATE_PERSECURITY(9002),
    CROSS_REFERENCING_PERSECURITY(9003),
    METADATA_SEARCH(9004),
    REMOVEALL(9005),
    UPDATE_BACKOFFICE(9002);

    private int exceptionCode;

    GSBBCacheCategory(int exceptionCode)
    {
        this.exceptionCode = exceptionCode;
    }

    public int getExceptionCode()
    {
        return exceptionCode;
    }
} 

public enum GSBBEncryptionCategory  {
.
.
.
}

クライアント コードでこれらの Enum にアクセスするための 1 つの場所を提供したいと考えています。現在、私は以下のようにこれを達成しました

public class GSBBExceptionCodes
{
 public static GSBBDecryptionCategory decryptionCategory;
 public static GSBBCacheCategory cacheCategory;
}

例外コードにアクセスするために、以下のようなことをしました

public static void main(String[] args) {
     System.out.println(GSBBExceptionCodes.decryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
     System.out.println(GSBBExceptionCodes.cacheCategory.UPDATE_PERSECURITY);
}

「<strong>静的フィールド GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE には静的な方法でアクセスする必要があります」</p>

警告なしで上記を達成することは可能ですか?

4

3 に答える 3

6

静的メンバー (フィールドまたはメソッド) を参照するには、2 つの方法があります。1 つはでWhateverClass.theField、もう 1 つはコンパイル時の型がです。前者の方がはるかに明確であるため、IDE は後者の代わりにそれを使用するように指示します。someInstance.theFieldsomeInstanceWhateverClass

より良い理由は、インスタンスによって静的メンバーを参照すると、メソッドがそのインスタンスと関係があるように見えるためです。実際にはそうではありません。実際の例を次に示します。

Thread myThread = getMyThread();
myThread.start();
myThread.sleep(5000);

一見するとmyThread、5 秒間 (5000 ミリ秒) スリープするように要求しているように見えますが、それはあなたがしていることではありません。最後の行は呼び出しとまったく同じであるため、現在のスレッドにスリープを要求していますThread.sleep(5000)。2 番目の例は、明らかに静的メソッドです。

または、別の例を次に示します。静的フィールドが変更可能であるとしましょう。

public class Foo {
    public static int value = 1;
}

(この public static ミュータブル フィールドは、他の理由から悪い考えですが、例を単純化します)。では、次のようにします。

Foo one = new Foo();
Foo two = new Foo();
one.value = 2;
two.value = 3;
System.out.println(one.value);
System.out.println(two.value);

「2」を出力してから「3」を出力するはずですよね?.valueしかし、いいえ -実際には両方の割り当てが同じ静的フィールドにあるため、「3」、「3」と出力されます。oneまたはtwoインスタンスが何かと関係があるというのは、単なる目の錯覚です。

私見、インスタンスから静的メンバーを参照する機能は誤機能です。しかし、それはあるので、避けるべきです。これは、コンパイラがあなたに提案しようとしていることです。

于 2013-08-13T16:49:44.720 に答える
1

これを試して :

public static void main(String[] args) {
     System.out.println(GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
     System.out.println(GSBBCacheCategory.UPDATE_PERSECURITY);
} 

現在、警告を削除する必要がある静的な方法でフィールドにアクセスしています。

于 2013-08-13T16:35:27.923 に答える
0

これらをpublic staticフィールドとして持つのではなく、内部クラスにする必要があるように思えます。

public class GSBBExceptionCodes {
  public enum GSBBCacheCategory {
    ...
  }
}
于 2013-08-13T16:35:02.973 に答える