1

我有不同的异常类别枚举如下

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  {
.
.
.
}

我想提供一个在客户端代码中访问这些枚举的地方。目前我实现了如下

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

有两种方法可以引用静态成员(字段或方法)。一个是WhateverClass.theField,另一个是someInstance.theFieldwheresomeInstance的编译时类型为WhateverClass. 前者更清晰,因此您的 IDE 会很有帮助地告诉您使用它而不是后者。

更好的原因是通过实例引用静态成员使得该方法看起来与该实例有关,而事实并非如此。这是一个真实的例子:

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

乍一看,您似乎要求myThread睡眠 5 秒(5000 毫秒),但这根本不是您在做的事情。您要求当前线程休眠,因为最后一行与 invoking 完全相同Thread.sleep(5000)。第二个例子更清楚地是一个静态方法。

或者,这是另一个例子。假设您的静态字段是可变的。

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

(由于其他原因,这个公共静态可变字段是一个坏主意,但简化了示例)。现在假设你这样做:

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”,对吧?但不——它会打印“3”、“3”,因为这两个分配.value实际上都是相同的静态字段。这只是一种错觉,即这些onetwo实例与任何事物有任何关系。

恕我直言,从实例中引用静态成员的能力是错误​​的。但它就在那里,所以你应该避免它。这就是编译器试图建议你做的事情。

于 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 回答