java中的static和final

java中的static和final,java,static,final,Java,Static,Final,我在第页阅读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()

我在第页阅读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
}
private static final List protoDeck=new ArrayList();
//初始化原型组
静止的{
for(Suit:Suit.values())
for(秩:Rank.values())
原型卡。添加(新卡(等级,套装));
}
公共静态数组列表newDeck(){
返回新的ArrayList(protoDeck);//返回原型组的副本
}
为什么protoDeck被声明为
静态的
最终的
?然后,使用静态循环初始化protoDeck。我知道静态变量在对象实例之间保留其值。但这是一个单例类(私有构造函数),因此无法实例化


那么,如上所述的好处是什么?如果proteDeck不是
静态的
最终的
,会有什么影响?

如果它不是静态的,代码将不会编译,因为newDeck方法是静态的,而newDeck是静态的,因为不同的卡没有不同的卡组


让它不是最终版本不会有什么不同。最后,您不能分配其他数组。但您仍然可以添加到它,因此它不是不变的。因此,这是一个常见的线索,但不是行为上的改变。

如果它不是静态的,代码将不会编译,因为newDeck方法是静态的,而newDeck是静态的,因为不同的卡没有不同的牌组

让它不是最终版本不会有什么不同。最后,您不能分配其他数组。但您仍然可以添加到它,因此它不是不变的。所以这是一个常见的线索,但不是行为上的改变。

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

对于
ArrayList
,它是一个工厂方法,方法
newDeck
的工作方式与类“CardArrayList”的构造函数的工作方式相同。它不是Java构造函数,而是工厂方法,但除此之外,它还有相同的用途:创建新的卡片组

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

静态final
变量包含用作新对象模板的原型。

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

对于
ArrayList
,它是一个工厂方法,方法
newDeck
的工作方式与类“CardArrayList”的构造函数的工作方式相同。它不是Java构造函数,而是工厂方法,但除此之外,它还有相同的用途:创建新的卡片组

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


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

代码的静态{..}部分将在Java虚拟机加载类的地方执行

在代码段中,它用于初始化protoDeck ArrayList


这并不遵循单例模式,因为代码中没有证据表明该类只实例化了一次。

在Java虚拟机加载类的地方,将执行代码的静态{…}部分

在代码段中,它用于初始化protoDeck ArrayList


这并不遵循单例模式,因为代码中没有证据表明该类只实例化了一次。

在类初始化中(在
静态
括号中的代码),程序生成该组的所有卡,并将其存储在
protoDeck

调用
newDeck
时,将返回deck的浅层副本。这意味着游戏中的所有纸牌对象都是相同的对象(只有一张“黑桃王牌”)。不过,他们在几个不同的平台上进行管理


对于这个例子来说,它有点太复杂了,如果不是使用
卡,而是使用其他类型的类(一个在RAM中初始化会很昂贵/昂贵,或者其他它们表示系统资源的类-数据库连接或类似的类-),它将更有意义。

(在
静态
括号中的代码)程序生成牌组的所有卡片,并将其存储在
protoDeck

当调用
newDeck
时,将返回该牌组的浅层副本。这意味着游戏中所有的牌对象都是相同的对象(只有一张“黑桃王牌”牌)。不过,它们在几个不同的牌组中进行管理

我觉得这个例子有点太复杂了,它会