探索Scala(3)-- 單例物件
研究一下Scala語言的單例物件(Singleton Objects),為下一篇文章做準備。
static不是關鍵字
上一篇文章提到過,interface並不是Scala語言關鍵字,可以自由使用。同樣,static在Scala裡也沒有特殊的含義,也是可以自由使用的,如下面程式碼所示:
單例物件
Java並不是完美的物件導向語言,包括很多缺陷,比如允許static欄位和方法,primitive型別,等等。Scala語言在這些方面都有所改進,所以號稱是比Java更OO的語言。既然去掉了static關鍵字,那麼如何像Java語言那樣,表達類欄位或類方法呢?Scala給出的解決方案是:單例物件。Java有一個Math類(java.lang.Math),裡頭全是static欄位和方法,部分程式碼如下所示:
public final class Math {
private Math() {} // Don't let anyone instantiate this class.
public static final double PI = 3.14159265358979323846;
public static int abs(int a) {
return (a < 0) ? -a : a;
}
}
下面我們用Scala語言重寫上面的Math類:
單例物件實現方式
下面看看Scala是如何實現單例物件的。觀察編譯結果可以看到,MyMath被編譯出兩個class:MyMath.class和MyMath$.class。我自己分析了一下這兩個class,下面是MyMath.class的反編譯結果:
public final class MyMath {
public static double PI() {
return MyMath$.MODULE$.PI();
}
public static int abs(int a) {
return MyMath$.MODULE$.abs(a);
}
}
可以得出如下結論:
- val欄位實際上也被編譯成了方法
- 兩個方法都是static,而且只是呼叫MyMath$.MODULE$的相應方法
再來看MyMath$.class的反編譯結果:
public final class MyMath$ {
public static final MyMath$ MODULE$;
private final double PI;
static {
new MyMath$();
}
private MyMath$() {
MyMath$.MODULE$ = this;
this.PI = 3.14;
}
public double PI() {
return this.PI;
}
public int abs(int a) {
return return (a < 0) ? -a : a;
}
}
就是普通的單例模式,這肯定也就是單例物件這一名稱的由來。使用單例物件
下面這段程式碼演示瞭如何使用單例物件:
看起來和使用Java靜態欄位或方法沒啥區別,下面是反編譯之後的main方法程式碼:
Predef$.MODULE$.println("PI is " + MyMath$.MODULE$.PI())
final int x = -18
final int y = MyMath$.MODULE$.abs(x)
伴隨類和伴隨物件
上面的例子中,我們定義了名為MyMath的單例物件,實際上,這並不妨礙我們定義同名的類。如下所示:
這種情況下,單例物件叫做同名類的Companion Object,類叫做單例物件的Companion Class。如果僅定了單例物件,但沒有定義同名的類,那麼這種情況下單例物件被叫做Standalone Object。注意:Companion Class和Object必須定義在同一個.scala檔案裡。
相關文章
- Scala單例物件、伴生物件單例物件
- Spring IoC 中的(Singleton)單例物件建立過程探索Spring單例物件
- iOS單例物件iOS單例物件
- Scala學習(六)---Scala物件物件
- 探索Scala(2)-- TraitsAI
- Scala(四):物件物件
- Scala中的單例以及鏈式表示式單例
- Scala學習 2 Scala物件導向物件
- 探索Scala(5)-- 基本型別型別
- Scala 類和物件物件
- scala物件導向物件
- Scala可變物件物件
- scala類和物件物件
- Scala 與設計模式(一):Singleton 單例模式設計模式單例
- 單例模式(3)單例模式
- Scala:數字是物件,函式也是物件!物件函式
- Singleton(單例)——物件建立型模式單例物件模式
- Scala中的包以及包物件物件
- 【Scala篇】--Scala中Trait、模式匹配、樣例類、Actor模型AI模式模型
- Unity3D 單例模式Unity3D單例模式
- 學好Spark/Kafka必須要掌握的Scala技術點(二)類、單例/伴生物件、繼承和trait,模式匹配、樣例類(case class)SparkKafka單例物件繼承AI模式
- Scala的物件導向程式設計物件程式設計
- Scala的類、屬性、物件欄位物件
- jQuery構造物件例項簡單介紹jQuery物件
- 單例項物件動態裝載問題?單例物件
- scala:分別使用懶漢式和餓漢式實現單例模式單例模式
- 將表單元素序列為物件程式碼例項物件
- 將form表單序列為物件例項程式碼ORM物件
- javascript 物件合併程式碼例項簡單分析JavaScript物件
- javascript物件導向繼承的簡單例項JavaScript物件繼承單例
- 虛擬機器物件探索虛擬機物件
- 設計模式——3單例模式(Singleton)設計模式單例
- ejb主物件,物件,例項 ?物件
- 引用物件與例項物件物件
- 確保物件的唯一性——單例模式 (五)物件單例模式
- 確保物件的唯一性——單例模式 (四)物件單例模式
- 確保物件的唯一性——單例模式 (三)物件單例模式
- 確保物件的唯一性——單例模式 (二)物件單例模式