gpt4 book ai didi

java - 应该以静态方式访问静态字段

转载 作者:行者123 更新时间:2023-11-29 06:37:33 24 4
gpt4 key购买 nike

我有如下不同的异常类别枚举

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 应该以静态方式访问

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

最佳答案

有两种方法可以引用静态成员(字段或方法)。一个是 WhateverClass.theField,另一个是 someInstance.theField,其中 someInstance 的编译时类型是 WhateverClass。前者更清晰,因此您的 IDE 会告诉您使用它而不是后者。

它更好的原因是通过一个实例引用一个静态成员使它看起来像该方法与该实例有关,但事实并非如此。这是一个真实的例子:

Thread myThread = getMyThread();
myThread.start();
myThread.sleep(5000);

乍一看,您似乎在要求 myThread hibernate 5 秒(5000 毫秒),但这根本不是您在做的事情。您要求当前 线程 hibernate ,因为最后一行与调用Thread.sleep(5000) 完全相同。第二个例子显然是一个静态方法。

或者,这是另一个例子。假设您的静态字段是可变的。

public class Foo {
public static int value = 1;
}

(出于其他原因,这个公共(public)静态可变字段是个坏主意,但简化了示例)。现在假设您这样做:

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 实例与任何事物都有任何关系,这只是一种错觉。

恕我直言,从实例中引用静态成员的能力是一个缺陷。但它就在那里,所以你应该避免它。编译器试图建议您这样做。

关于java - 应该以静态方式访问静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com