Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

定数の定義について

こんばんは。

定数のみを定義する際、クラスとインターフェース、どちらでやったほうがパフォーマンスは高いのでしょうか。

どちらともよくみかける為、気になった次第です。

13

回答

9866

閲覧

13件の回答

評価

0

パフォーマンス?何を言ってるんだ?

評価

0

質問の意図がよく見えませんが…
static(静的)かどうかということ??
finalクラスでstaticで定義するよりかは
クラス内にstaticなしでfinalの方が
良いですけどね。

要はなんでもかんでもstaticにするのではなく
分別することが大事。
そりゃあstaticにした方が好きなときに
使用できるが当然、無駄なメモリーを
常時、使用することになるので。
インスタンス生成してからしか必要ないような
定数はstaticを外すべき。
以上

評価

0

>インスタンス生成してからしか必要ないような
>定数はstaticを外すべき。

インスタンスの生成毎にメモリが確保されるわけですなwww

評価

0

public class A1{
public static final int B=1;
}
これと
public interface A2{
int B=1;
}
これの違いってことでしょ。

評価

0

インターフェースっていうのが
何なのか理解すれば
おのずと答えは出る

評価

0

interfaceクラスで定義しても結局実装する
クラスが必要なので上記で私が言っているのと同じ。
そもそもstatic変数を使用するならわざわざinterfaceクラスを作成する必要などない。
共通静的定数を使用したいなら共通のfinalクラスを作成してそのクラスにstatic変数を集めるべき。
クラス設計はあとあとアプリのバージョンアップなどが多数あるプロジェクトでは非常に重要である。

そもそもinterfaceに定義するってことは
パターン?
public class interface TestIf(){
    public final int a=1;
}
public class Test implements TestIf(){
}


パターン?
public class interface TestIf(){
    public static final int a=1;
}
public class Test(){
    // 使用する
    int i = TestIf.a;
}

私が思うのは上記はおかしい。
下記にすべきってこと。

public final class Common(){
    public static final int a=1;
    public static final int b=2;
           .
           .
}

じゃあ共通定数クラスとして
どのクラスからでもCommon.定数で使用できるし
共通クラスの静的定数を使用しているのがひとめで
わかるし。interfaceで定数を使用するのはその
interfaceで使用する場合、もしくは実装クラスが
共通で使用する定数のみとすべき!

評価

0

まだ話題になっていませんが、定数をインターフェイスに持たせると可読性が大きく落ちます。
「この定数、実際にはどんな値なんだ?あれ?コードはどこだ?」という事態が続出…。

インターフェイスを使用するとコード書くときに少し楽ができるかもしれませんが、可読性の低下は全然割に合わないデメリットです。

評価

0

定数の実際の値を気にしないといけないのは、設計が悪いんじゃないかと。

例えば、定数の定義場所があちこちに散ってる、
ってことではありませんか?
かぶってはならない定数は、1カ所に集まっているべきです。

評価

0

>あああ様
共通定数クラスって、カプセル化に反さないですか?

>ONE様
私も不良社員様と同じことを感じました。
値を気にしなければいけないというのは設計が悪いのでは?

評価

0

なぜ理解してもらえないのか考えていましたが、ようやく分かりました。

通常定数を参照する場合、クラス名+フィールド名で参照しますが、インターフェイスで実現すると、定数を参照するクラスでimplementsしてしまえばクラス名なしで参照できます。
他の人が作ったそういうシステムの故障解析をする羽目になったときに、定数宣言が見つからなくて探し回る羽目になったことがあります。
定数の値が必要になったのは、キーストアか何かのパスワードを設定していたためだったと思います。

私はインターフェイスでの実現はそうする(定数を参照するクラスは全部そのインターフェイスをimplementsする)と思い込んで回答していました。
インターフェイスで実現しても、方々でimplementsするのでなければ先の私の回答は当てはまりません。
混乱させたようであれば済みません。

評価

0

単純に「集めただけ」っていう使い方も、あるしねえ。

class A{
   interface B{
      int C=1;
      int D=2;
   };
}

なんてのもあるし。

評価

0

>とおりすがりさま
共通定数クラスって言っても
普通はクラス変数に使用するようなものは
定義しないので反さないと思いますよ(^^;)

共通で使用する定数なので通常は
クラス変数には使用しないと思います。

が、VMでひとつ(Singleton)の共通クラス変数と
して使用する場合は除きますが…
たとえばひとつのVMで共通のログ用クラスとか、
そんなんだったら共通クラスとして使用してもOKだし。
もしくは基本に忠実にコンストラクタprivateにして
publicインスタンス取得メソッドを作るか。

どちらにしてもカプセル化に影響が出るような
共通クラスとは設計が悪い以外の何者でもありません(^^;

評価

0

interface IConst{
    ...定数
}

class Foo implements IConst{
}
なんてコードをよく見るけどさ、
IConst c = new Foo();なんて意識しないでしょ?
やるべきじゃないよ。インターフェイスは便利機能じゃない。

インターフェイスは機能が使えることを示すのが主目的なので、
クラス名を省略して使えるから・・・云々というのは、完全に目的を間違ってると思う。

ちなみに、
>他の人が作ったそういうシステムの故障解析をする羽目になったときに、定数宣言が見つからなくて探し回る羽目になったことがあります。
っていうのは、単にIDE使えば?という感じがする。
つうか、参照できないものは使えるはずがないので、
IDE使わなくても、単にクラス階層を追っかけるだけで済むはずだけど。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。