あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

定数定義のインタフェース (java)

java の interface で定数のみの定義を行っているものがありますが
以下の理由で、それは良くありません。

それは、public static final の field だけで構成されていて、method を持っていません。
定数をクラス又はインスタンスで使用するということは、実装の詳細です。
そして定数を、実装クラスから、無意味に外部公開してしまうことになります。他のクラスからは実装クラスに属する定数のように見えてしまいます。

また、外部公開すると互換性を保証し続けなければならなくなり、不要になってもインターフェースを除外することができません。

それから、本来はsuper class だけの参照にとどめておきたかった定数が、sub class まで参照できてしまいます。つまり、このクラスをextends したすべての sub class で名前空間が汚染されてしまいます。(名前の衝突)

別の方法を検討すると、
何らかの要素を識別するための目的等であれば、定数が列挙型のメンバーとするのが良い選択です。java5以降は、 enum を使用します。
またはインスタンス化が不可能なユーティリティークラスを使用します。

このユーティリティクラスの定数を使用するには、このユーティリティクラスを import して、さらに、クラス名で修飾する必要がありますが、
java5以降は、 import static を使用すれば、クラス名で定数を修飾することが不要になります。

本質的に interface は、定数だけを定義するため用意されたものではないので、
method の無い interface の定義は、避けるべきです。