Java 静态字段应以静态方式访问
我有不同的异常类别枚举,如下所示Java 静态字段应以静态方式访问,java,static,enums,Java,Static,Enums,我有不同的异常类别枚举,如下所示 public enum GSBBCacheCategory { SEARCH(9001), UPDATE_PERSECURITY(9002), CROSS_REFERENCING_PERSECURITY(9003), METADATA_SEARCH(9004), REMOVEALL(9005), UPDATE_BACKOFFICE(9002); private int exceptionCode;
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\u DECRYPTION\u失败应以静态方式访问””
是否可以在没有任何警告的情况下实现上述功能?听起来,这些字段应该是内部类,而不是
公共静态字段:
public class GSBBExceptionCodes {
public enum GSBBCacheCategory {
...
}
}
听起来应该是内部类,而不是作为公共静态
字段:
public class GSBBExceptionCodes {
public enum GSBBCacheCategory {
...
}
}
试试这个:
public static void main(String[] args) {
System.out.println(GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
System.out.println(GSBBCacheCategory.UPDATE_PERSECURITY);
}
您现在正在以静态方式访问该字段,这将删除警告。尝试以下操作:
public static void main(String[] args) {
System.out.println(GSBBDecryptionCategory.ERRORCODE_DECRYPTION_FAILURE);
System.out.println(GSBBCacheCategory.UPDATE_PERSECURITY);
}
您现在以静态方式访问该字段,这将删除警告。有两种方式引用静态成员(字段或方法)。一个是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
实例与任何事情都有关系
依我看,从实例中引用静态成员的能力是一种错误的功能。但是它在那里,所以你应该避免它。编译器正试图建议您这样做。引用静态成员有两种方法(字段或方法)。一个是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
实例与任何事情都有关系
依我看,从实例中引用静态成员的能力是一种错误的功能。但是它在那里,所以你应该避免它。编译器正试图建议您这样做。是的,这是一个很好的解决方案,但问题是我必须在一个类中定义所有类别,我有大约20个类别,每个类别有5个常量,这不适合在一个类中。如果您想“在客户端代码中提供一个位置来访问这些枚举,”你必须这样做。就我个人而言,我会选择@Simon的方法,放弃将这些合并到一个地方的希望。是的,这是一个很好的解决方案,但问题是我必须在一个类中定义所有类别,我有近20个类别,每个类别有5个常量,这不适合在一个类中。如果你想“在客户端代码中提供一个访问这些枚举的位置,”这就是你必须要做的。就我个人而言,我会选择@Simon的方法,放弃将它们合并到一个位置的希望。