gpt4 book ai didi

java - java中的static和final

转载 作者:行者123 更新时间:2023-11-29 03:42:25 25 4
gpt4 key购买 nike

我正在从 this 阅读有关 Java 中的枚举示例页。

在第一个例子中,我唯一不明白的部分是在这部分代码中使用了 static 关键字:

private static final List<Card> protoDeck = new ArrayList<Card>();

// Initialize prototype deck
static {
for (Suit suit : Suit.values())
for (Rank rank : Rank.values())
protoDeck.add(new Card(rank, suit));
}

public static ArrayList<Card> newDeck() {
return new ArrayList<Card>(protoDeck); // Return copy of prototype deck
}

为什么 protoDeck 被声明为 staticfinal?之后,使用静态循环来初始化 protoDeck。我知道静态变量在对象实例之间保留它们的值。但是这是一个单例类(私有(private)构造函数),所以不能实例化。

那么这样做有什么好处呢?如果 proteDeck 不是 staticfinal 会有什么影响?

最佳答案

从技术上讲,这不是单例类。 (一个单例有一个实例,这个没有一个!)

它是 ArrayList<Card>工厂方法 , 和方法 newDeck与类“CardArrayList”的构造函数的工作方式相同。它不是 Java 构造函数,而是工厂方法,但除此之外,它具有相同的目的:创建新的卡片组。

使用类 CardArrayList和子类型ArrayList显然是另一种选择。试试这个作为一个练习:写这样的类,这样它就可以达到同样的目的。尝试使用常量 ( static final ) 来保存初始对象集。您会注意到这两者之间几乎没有什么区别,只是这种方法清楚地表明没有添加功能,但结果是“只有一个 ArrayList<Card> 包含一整副牌”。子类化可能意味着有额外的功能,例如确保甲板不会被弄乱。

static final变量包含用作新对象模板的原型(prototype)。

关于java - java中的static和final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546950/

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