我相信这是由于开发人员使用String作为替代(最有可能是无意的)枚举,静态String []是一种分组这些类型的方法。
它可能是在撰写文章时常见的设计缺陷
对于我们所知道的,本文可能针对Java 4代码库。
不是说这是在Java 4中编写的,但是当时存在的大多数生产代码可能都是以Java 4编写的。缺少autoboxing陷阱(这是很常见的),没有提到泛型(原始类型)使我相信这个。
为什么Oracle会执行这样的隐秘原则?
我不相信它与全球国家有关,因为我确信单身人士将被提及(作为全球国家的旗帜)。
我怀疑并发是一个问题,因为这篇文章没有提到任何关于跨线程共享数据,甚至使用多线程的事情。你会假设他们会提到关于线程环境的SOMETHING。
类型枚举的滥用字符串在当天很常见,所以我确信这个声明(如果我认为是相关的)在当时更容易理解。我发现这个声明在这个时候呢是一个很神秘的回答,但是没有人在意这个问题,导致在挖掘这个时候缺少谷歌的结果。
我的答案
到目前为止,开发人员仍然滥用String类型信息。由于缺乏枚举,我可以看到一个开发人员可能会试图做一些事情:
class Card {
static String HEARTS = "HEARTS";
static String DIAMONDS = "DIAMONDS";
static String CLUBS = "CLUBS";
static String SPADES = "SPADES";
static String[] CARD_TYPE = {
HEARTS, DIAMONDS, CLUBS, SPADES
};
private String type;
//...
}
使用数组来轻松循环(与Enum.values()一样)。
使用String作为枚举是皱眉的:
>这不是安全的。如果MAGE可以传递给一个方法,任何字符串都可以传递到它的位置。这导致我们…
>错误更容易做到。一般的开发人员看起来可能看起来很小,但可能对具有大型代码库的企业和许多消费者(如Oracle)来说是灾难性的。例如:隐藏的打字错误导致比较返回false。这样可以防止服务启动。缺少这种服务会导致错误。如果在用户注意到错误之前找不到,可能会导致漏洞。
这可以通过使用Java的内置类型系统进行修复:
abstract class CardType {
}
class Hearts extends CardType {
}
....
要么
枚举CardType {
听力,DIAMONDS,…;
}
这不仅容易出错,而且可以让您使用多态,这样就无需检查值来触发特定行为。该行为可以包含在类型本身中。
虽然我不能答应这是正确的答案,但它似乎是唯一的答案,这并不取决于声明中没有提及的修饰符的使用。
是的,上面的例子不使用正确的常量(缺少final)。但是尽管常数应该是首选,但是它们不需要从这种设计中获益(可以使用String作为类型信息),也不需要设计工作。由于人们可能并不总是为此使用常量,所以他们可能没有为此目的的最终或“数组的常数”。