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的方法,放弃将它们合并到一个位置的希望。