java中的static和final
我在第页阅读Java中的枚举示例 在第一个示例中,我唯一不理解的部分是在代码的这一部分中使用了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()
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
时,将返回该牌组的浅层副本。这意味着游戏中所有的牌对象都是相同的对象(只有一张“黑桃王牌”牌)。不过,它们在几个不同的牌组中进行管理
我觉得这个例子有点太复杂了,它会