我有不同的例外类别枚举如下
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);
}
其中说“应以静态方式访问静态字段GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE ”
是否可以在没有任何警告的情况下实现上述目标?
答案 0 :(得分:6)
有两种方法可以引用静态成员(字段或方法)。一个是WhateverClass.theField
,另一个是someInstance.theField
,其中someInstance
的编译时类型为WhateverClass
。前者更清晰,因此您的IDE有助于告诉您使用它而不是后者。
更好的原因是,通过实例引用静态成员使得它看起来像该方法与该实例有关,但它没有。这是一个真实的例子:
Thread myThread = getMyThread();
myThread.start();
myThread.sleep(5000);
乍一看,看起来你要求myThread
睡5秒(5000毫秒),但这根本不是你在做什么的。您要求当前线程休眠,因为最后一行与调用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
的两个赋值实际上都是相同的静态字段。 one
或two
实例与任何事物都有任何关系只是一种视错觉。
Imho,从实例引用静态成员的能力是错误的。但它就在那里,所以你应该避免它。这是编译器试图建议你做的事情。
答案 1 :(得分:1)
试试这个:
public static void main(String[] args) {
System.out.println(GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
System.out.println(GSBBCacheCategory.UPDATE_PERSECURITY);
}
您现在以静态方式访问该字段,该方式应删除警告。
答案 2 :(得分:0)
听起来不是将这些作为public static
字段,而应该是内部类:
public class GSBBExceptionCodes {
public enum GSBBCacheCategory {
...
}
}