应以静态方式访问静态字段

时间:2013-08-13 16:33:35

标签: 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;

    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

是否可以在没有任何警告的情况下实现上述目标?

3 个答案:

答案 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的两个赋值实际上都是相同的静态字段。 onetwo实例与任何事物都有任何关系只是一种视错觉。

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