我有不同的例外类别枚举如下
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 {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
我想在客户端代码中提供一个访问这些枚举的位置.目前我实现了如下
public class GSBBExceptionCodes
{
public static GSBBDecryptionCategory decryptionCategory;
public static GSBBCacheCategory cacheCategory;
}
Run Code Online (Sandbox Code Playgroud)
现在访问异常代码我已经做了类似下面的事情
public static void main(String[] args) {
System.out.println(GSBBExceptionCodes.decryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
System.out.println(GSBBExceptionCodes.cacheCategory.UPDATE_PERSECURITY);
}
Run Code Online (Sandbox Code Playgroud)
其中说" 应该以静态方式访问静态字段GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE "
是否可以在没有任何警告的情况下实现上述目
有两种方法可以引用静态成员(字段或方法).一个是WhateverClass.theField,另一个是someInstance.theField其中someInstance具有一个编译时间类型WhateverClass.前者更清晰,因此您的IDE有助于告诉您使用它而不是后者.
更好的原因是,通过实例引用静态成员使得它看起来像该方法与该实例有关,而事实并非如此.这是一个真实的例子:
Thread myThread = getMyThread();
myThread.start();
myThread.sleep(5000);
Run Code Online (Sandbox Code Playgroud)
乍一看,看起来你要求myThread睡5秒(5000毫秒),但这不是你在做什么.您要求当前线程休眠,因为最后一行与调用完全相同Thread.sleep(5000).第二个例子更明显是一种静态方法.
或者,这是另一个例子.假设您的静态字段是可变的.
public class Foo {
public static int value = 1;
}
Run Code Online (Sandbox Code Playgroud)
(由于其他原因,这个公共静态可变字段是一个坏主意,但简化了示例).现在让我们说你这样做:
Foo one = new Foo();
Foo two = new Foo();
one.value = 2;
two.value = 3;
System.out.println(one.value);
System.out.println(two.value);
Run Code Online (Sandbox Code Playgroud)
有点看起来应该打印"2"然后打印"3",对吧?但是没有 - 它会打印"3","3"因为两个赋值.value实际上都是相同的静态字段.这只是一种视觉错觉,one或者这些two实例与任何东西都有关系.
Imho,从实例引用静态成员的能力是错误的.但它就在那里,所以你应该避免它.这是编译器试图建议你做的事情.
| 归档时间: |
|
| 查看次数: |
8457 次 |
| 最近记录: |