scalaでJavaに無い概念として、「シンボルリテラル」というものがあります。
言ってしまうと指定された文字列を持つラッパーみたいなもので、
同じ引数を指定されたシンボルリテラルはメモリ上で同じ参照を示すことが保障されます。
とまぁ、これだけかいてもわからないので、とりあえずサンプルコードと実行結果を。
■SimbolLiteralMain.scala
package jp.gr.kmtn.scalatutorial.grammertips
/**
* シンボルリテラルテスト用
*/
object SimbolLiteralMain {
/**
* シンボルリテラルテスト用プログラムエントリポイント
*/
def main(args: Array[String]): Unit =
{
val simbolFirst = 'Simbol
Console.println(simbolFirst);
Console.println(simbolFirst.getClass())
val simbolSecond = 'Simbol
Console.println(simbolSecond)
Console.println(simbolSecond.toString())
Console.println(simbolSecond.getClass())
Console.println(simbolSecond.name)
}
}
このコードを実行すると下記の結果になります。
'Simbol
class scala.Symbol
'Simbol
'Simbol
class scala.Symbol
Simbol
実際に同じシンボルリテラルは同じオブジェクトを使用していることが分かります。
(simbolFirstとsimbolSecondは同じオブジェクトID)
注意すべきは、「シンボルリテラル」≠「文字列リテラル」ということです。
シンボルリテラルは文字列とは比較できません。
そもそも型が違うため、マップで比較することも出来ません。
そのため、シンボルリテラル中の文字列リテラルを使用する際にはnameフィールドを参照しましょう。
nameフィールドで文字列と簡単に比較できるため、
プログラム内部での定数取り回しの記述はかなり少なく出来る。。。のかな?
0 コメント:
コメントを投稿