Effective Java について Scala で考える(その1)

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

まえからこれ書きたくて、いざ書こうとして調べだしたら既に英語で似たようなものあった(´・ω・`)

Scala == Effective Java ?

だがしかし、参考にしつつ、あえて自らの視点で(?)書いてみますよ(`・ω・´) *1
で、そもそも元の本かなり有名で、本気で全部比較していって書いたら、普通に本が一冊出来上がっちゃうと思うので、まずは、比較的簡単でわかりやすいところを挙げてみます。

3 privateのコンストラクタかenum型でシングルトン特性を強制する

Scalaにはobjectっていう、シングルトン専用の構文あるし。それをJavaコードに訳すとどうなるのか?については、このへんが詳しいのでオヌヌメですぉ

8 equals をオーバーライドする時は一般規約に従う
9 equals をオーバーライドする時は、常にhashCodeをオーバーライドする
10 toStringを常にオーバーライドする
74 Serializableを注意して実装する

case class で、なおかつ、フィールドをimmutableな型*2にすれば、これ全部簡単に満たせるよ!case classにすれば、このへんはコンパイラさんが自動で生成してくれるわけです。まえに自分がcase classについて説明したもの

14 publicのクラスでは、publicのフィールドではなく、アクセッサーメソッドを使う

Scalaでは、publicのフィールド自体が、原理的に作れません!必ず自動でアクセッサが生成されます!

15 可変性を最小限にする

色々な点からScalaでは、可変性( 状態を持つこと )をそもそも簡単にすくなくできる仕組みがあるというか、不変な、状態を持たないClassを書きやすい。
たとえば、

  • デフォルトで名前空間に入っている、Map、List、Setなどがimmutable
  • Javaに比べて、コレクションクラスがimmutableなものが標準ライブラリに沢山ある
  • メソッドの引数が、デフォルトでJavaでfinalが付いているのと同じ
  • immutableな変数が短く書きやすい

Javaの場合

final String scalachan = "Scalaちゃん";

Scalaの場合

val scalachan = "Scalaちゃん"

細かいけれど、(型推論もあるおかげで) 上記の例の場合、Javaの場合と同じことをしているのにもかかわらず、10文字*3少なく書けますね。

36 常にOverride アノテーションを使用する

アノテーションではなく、そもそもoverrideってキーワードがあって、overrideしたのに付けてなかったらコンパイルエラーですから

46 従来のforループよりfor-eachループを選ぶ

そもそも「従来のforループ」っていう、

for(int i = 0 ; i < 10 ; i ++ ){

}

というしくみのループ自体がScalaには存在しません!


他にもあるでしょうが、とりあえずわかりやすいのはこのくらいでしょうか。また気が向いたら、他の項目も書くかもしれないし、書かないかもしれない(´・ω・`)

*1:というか(コメント含めて)全部訳すほどの能力がないだけだが・・・有名なScalaistの人もコメントしてるので、それ含めて読むことをオススメ

*2:いや、本当はもうちょっとちゃんと考えないといけないけど。それらのフィールドのクラスが、ただしくhashCodeやequalsを実装してれば、自然とそれを使ってcase class作れば正しく実装されるという感じ

*3:セミコロン考えれば11文字か