• 締切済み

定数について

定数の使用の仕方について悩んでいます。 インターフェースに定数を宣言して、 それを実装(Implements)し使う方法と、 クラスで定数を宣言して、 それを参照して使う方法とで悩んでいます。 どちらもstaticな定数を使用しているのですが、 パフォーマンス面での違いとかはないのでしょうか? もし、定数の取り扱いについてほかにいい方法があるのであれば、 教えてほしいです。 お願いします。

  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • unibon
  • ベストアンサー率47% (160/340)
回答No.2

> インターフェースに定数を宣言して、 > それを実装(Implements)し使う方法と、 > クラスで定数を宣言して、 > それを参照して使う方法とで悩んでいます。 昔は interface に public static final int などを書くのが流行り、古い書籍等にもそうせよと書いてあるかもしれませんが、古臭いやりかたです。いまどきはやらないと思います。 > どちらもstaticな定数を使用しているのですが、 > パフォーマンス面での違いとかはないのでしょうか? ミリ秒を争うような特殊な環境で使わない限り、パフォーマンスがどうこうということを気にするのではなく、あくまでもクラス構成で決めたほうが良いです。interface だから、class だから、ということだけで決めるものではないです。 また、Java 1.5 から列挙型(enum)というものが使えるようになりました。本来は「列挙」に使うものなので、足したり引いたりするような演算にはあまり向かないかもしれませんが、場合によってはそういうものを使うことも検討されたほうがよいかもしれません。 > このように、 > 定数だけが定義されているクラスを作成して、 > そのクラスから定数を参照して使おうと考えているのですが、 > それは、あまりよろしくない考え方なのでしょうか? 別に悪くはありません。これを class から interface に変えろということはないです。(ただ、このクラスに入れるべきかどうかはまた別の問題としてあるとは思います。) > 後、インターフェースなのですが、 > 実装するたびにメモリの使用量が増えていくということはないのでしょうか? 細かな実装を気にしていたらもしかしたらそういうこともまったくないとは言えなくないかもしれませんが、そんなことはほんとうに瑣末なことです。もっとほかに考慮しないことがたくさんあります。定数のメモリー消費量を気にするのは、優先度を1741番目位に落としておけば良いです。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.1

>パフォーマンス面での違いとかはないのでしょうか? ない、と考えて差し支えないのではないでしょうか。 厳密な言語仕様的にはあるかもしれないですが、 プログラム全体のパフォーマンスに影響するほどではないのでは、と思います。 >もし、定数の取り扱いについてほかにいい方法があるのであれば、 どちらかと言うと、設計的な側面から考えた方が良いかと思います。 その定数が、本来どこに属するべきものなのか、ということです。 インターフェースに定義した場合、そのインターフェースを実装する全てのクラスで使用可能になります。 一方、クラスに定義する場合は、そのクラスまたは派生クラスのみで利用されるものであり、 本来インターフェースの機能に関係ないものであるはずです。 その定数が何を意味しているのかによって、どちらに定義するかが決まってくると思います。 例えば、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

syana1159
質問者

補足

ご回答ありがとうございます。 クラスで定義して使う場合なのですが、 +++++++++++++++++++++++ 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; } … } +++++++++++++++++++++++ このように、 定数だけが定義されているクラスを作成して、 そのクラスから定数を参照して使おうと考えているのですが、 それは、あまりよろしくない考え方なのでしょうか? 後、インターフェースなのですが、 実装するたびにメモリの使用量が増えていくということはないのでしょうか?

関連するQ&A

  • 定数の使用について

    こんばんは。 ふと疑問に思ったので、質問させていただきます。 Aと言うクラス(Class)があったとします。 Bと言うインターフェイス(Interface)があったとします。 このBのインターフェイスに「AORINGO」と言う定数が宣言 されています。 「AORINGO」を使用したい場合、Bと言うインターフェイスの パッケージをインポート(import)すれば、B.AORINGOと言うように、 「インターフェイス名」+「定数名」でアクセスできますよね。 また、AクラスにBのインターフェイスをインプリメント(implements) すればそのまま定数名だけ(AORINGO)で使用できますよね。 これって何が違うのでしょうか?? 定数名だけで使える方が、楽な気がするのでインプリメントしちゃうのが いい感じがするのですが。。。 そもそもインポート(import)すると、そのクラスが呼ばれた時にインポート されているパッケージが読み込まれるのでしょうか?? インプリメント(implements)することによるメリット、デメリット等、 動き的な所がいまいち、理解できていません。 また、インポートする際に、アスタリスク(*)で宣言すると、そのパッケージ を指す事になると思いますが,単一のパッケージだけを指定する方が良いのでしょうか?? その辺のメリット、デメリット等も教えていただけると助かります。 よろしくお願い致します。 #わかりにくい文章となって、すいません。。

    • ベストアンサー
    • Java
  • 定数宣言

    定数を宣言時に、 public static final String SQL_QUERY = "select * from table" のように、宣言しているのを書籍やweb上で見ることがよくあります。 上記宣言のstatic修飾子について、なぜ使用するのでしょうか?

    • ベストアンサー
    • Java
  • VB6で外部から静的アクセスが可能な定数

    VB6で(正確にはExcelVBAですが)ちょっとプログラムを組んでいるのですが、 クラス内で、外部からアクセス可能な静的定数を宣言を行いたいのですが、 宣言方法が分からず止まってしまいました。 出来たかどうかも記憶にありません・・・。調べても分からず;; Static Const var As String = "hoge" みたいな事をしたいんですが、やり方が分かる方ご教示下さい。

  • Javaのプログラムについての質問です。

    Listインターフェースの実装クラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。 注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。 以下は極最初期のソースになります。 import java.util.List;  public interface Interface{   int size();   boolean add();   boolean remove();   void clear();   get();   set();  } public class LocalList implements Interface{ class Main implements LocalList {  public static void main(String[] args) {     } } Listインターフェースについてネットで調べてはいるのですが、具体的な解決方法が見えてきません。 どなたか参考ソースや考え方などを教えていただけないでしょうか。よろしくお願い致します。

  • 共通な定数の宣言について

    初心者です。 どのモジュールからも参照できる定数を宣言するとき、 Global Const XXX = 000 Public Const XXX = 000 どちらを使用すればいいのでしょうか?両者の違いは 何なのでしょうか?HELPを見てもイマイチわかりません。 どなたか教えて下さい。m(_ _)m

  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • インターフェース

    インターフェースについて学ぼうと思っているのですが、 どうもいまいち何がなんだかわからなくなっています。 インターフェースはクラスによって実装され、 実装クラスはインターフェースで宣言されている 抽象メソッドを実行する とあるのですが、実装とは何ですか? 抽象メソッドとは何ですか?

    • ベストアンサー
    • Java
  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • androidのインターフェースについて

    andoroidプログラミングを勉強している初心者です。 インターフェースの実装 というのが全くわからず困っています。 インターフェースはテレビのリモコンみたいなものだ、と本でみたことがありますが 意味が全くわかりません。 class クラス名 implements インタフェース名 { : } でインターフェースが実装できるということですが、 何のためにこれをやるのでしょうか?

    • ベストアンサー
    • Java
  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java

専門家に質問してみよう