- 締切済み
定数について
定数の使用の仕方について悩んでいます。 インターフェースに定数を宣言して、 それを実装(Implements)し使う方法と、 クラスで定数を宣言して、 それを参照して使う方法とで悩んでいます。 どちらもstaticな定数を使用しているのですが、 パフォーマンス面での違いとかはないのでしょうか? もし、定数の取り扱いについてほかにいい方法があるのであれば、 教えてほしいです。 お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- unibon
- ベストアンサー率47% (160/340)
> インターフェースに定数を宣言して、 > それを実装(Implements)し使う方法と、 > クラスで定数を宣言して、 > それを参照して使う方法とで悩んでいます。 昔は interface に public static final int などを書くのが流行り、古い書籍等にもそうせよと書いてあるかもしれませんが、古臭いやりかたです。いまどきはやらないと思います。 > どちらもstaticな定数を使用しているのですが、 > パフォーマンス面での違いとかはないのでしょうか? ミリ秒を争うような特殊な環境で使わない限り、パフォーマンスがどうこうということを気にするのではなく、あくまでもクラス構成で決めたほうが良いです。interface だから、class だから、ということだけで決めるものではないです。 また、Java 1.5 から列挙型(enum)というものが使えるようになりました。本来は「列挙」に使うものなので、足したり引いたりするような演算にはあまり向かないかもしれませんが、場合によってはそういうものを使うことも検討されたほうがよいかもしれません。 > このように、 > 定数だけが定義されているクラスを作成して、 > そのクラスから定数を参照して使おうと考えているのですが、 > それは、あまりよろしくない考え方なのでしょうか? 別に悪くはありません。これを class から interface に変えろということはないです。(ただ、このクラスに入れるべきかどうかはまた別の問題としてあるとは思います。) > 後、インターフェースなのですが、 > 実装するたびにメモリの使用量が増えていくということはないのでしょうか? 細かな実装を気にしていたらもしかしたらそういうこともまったくないとは言えなくないかもしれませんが、そんなことはほんとうに瑣末なことです。もっとほかに考慮しないことがたくさんあります。定数のメモリー消費量を気にするのは、優先度を1741番目位に落としておけば良いです。
- neko_noko
- ベストアンサー率45% (146/319)
>パフォーマンス面での違いとかはないのでしょうか? ない、と考えて差し支えないのではないでしょうか。 厳密な言語仕様的にはあるかもしれないですが、 プログラム全体のパフォーマンスに影響するほどではないのでは、と思います。 >もし、定数の取り扱いについてほかにいい方法があるのであれば、 どちらかと言うと、設計的な側面から考えた方が良いかと思います。 その定数が、本来どこに属するべきものなのか、ということです。 インターフェースに定義した場合、そのインターフェースを実装する全てのクラスで使用可能になります。 一方、クラスに定義する場合は、そのクラスまたは派生クラスのみで利用されるものであり、 本来インターフェースの機能に関係ないものであるはずです。 その定数が何を意味しているのかによって、どちらに定義するかが決まってくると思います。 例えば、java.sql.Connectionインターフェースは、データベースとの接続を表現するインターフェースですが、 データベースがトランザクションを扱うかどうかを表す定数があります。 データベースにトランザクションの有無は必須なので、ここで定義しているのでしょう。 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/sql/Connection.html 他にも、J2EEにはjavax.servlet.http.HttpServletRequestインターフェースがあります。 HTTPサーブレットの要求情報に関するインターフェースです。 こちらには、認証方式を表す定数が定義されています。 http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/http/HttpServletRequest.html
補足
ご回答ありがとうございます。 クラスで定義して使う場合なのですが、 +++++++++++++++++++++++ public class Sumple{ public static final int A; public static final int B; public static final int C; } public class B{ int b; public B(){ b = Sumple.A + Sumple.C; } … } +++++++++++++++++++++++ このように、 定数だけが定義されているクラスを作成して、 そのクラスから定数を参照して使おうと考えているのですが、 それは、あまりよろしくない考え方なのでしょうか? 後、インターフェースなのですが、 実装するたびにメモリの使用量が増えていくということはないのでしょうか?