Jの衝動書き日記

さらりーまんSEの日記でございます。

Effective Javaの読書メモ 第4章 クラスとインタフェース

 今回はちょっと短めだが大切なことである。

 ちなみに今回駄目だしされている定数インタフェースも定数インタフェース実装もしたことがあった……。なにせ定数定義の長さを回避するテクニックとして定数インタフェースの実装はJavaの初期の頃に紹介されていたしなぁ……。CからJavaに入ったこともあって、define定義がJavaだとやたら長くなったなぁという印象があり、よく定数インタフェースの実装をやちゃってたのだ。

項目19 型を定義するためだけにインタフェースを使用する

インタフェース使用の原則

 インタフェースをクラスが実装する目的は、そのクラスのインスタンスでクラスは何ができるかを述べるためである。それ以外の用途で使用するべきではない。

 定数インタフェースはインタフェース利用の駄目な例である。特に、インタフェース名の修飾を回避するために定数利用クラスが定数インタフェースを実装していはいけない。

 

定数インタフェースの実装が駄目な理由

  • 定数インタフェースを実装することでその実装の詳細をクラスの公開APIに漏洩してしまう
  • 定数インタフェースを実装していることはクラスを使用するユーザにとって何の意味もない
  • 将来のリリースで定数が不要になったとしてもバイナリ互換性の維持のためインタフェースは実装しなければならない

 

ではどうするのか?

  • 既存のクラスやインタフェースに強く結びついている定数はそこで定義する →クラス名が異れば、変数名が被っても問題ない
  • enum型で定数を定義する → Javaenumは単なる定数定義ではなくimmutableなクラス
  • インタフェースではなくインスタンス化不可のクラスで定義する

 ちなみにstaticインポートすればクラス名の省略が可能らしい。import hoge.Const.*;とやればConst.HOGEのようにクラス名.変数でなく、HOGEのみで変数を利用できる。 

参考文献

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)