2010-12-17 9 views
0

クラスimplementをインターフェースとして使用せず、代わりに最後のフィールドを直接使用する利点はありますか?例えば:最終フィールドまたはインターフェイスに直接アクセスするインターフェイスを実装しますか?

public interface MyInterface { 
    int CONST_A = 16; 
    int CONST_B = 45; 
} 

アプローチ1:

public class MyClass implements MyInterface { 

    MyClass() { 
     System.out.println("A = " + CONST_A); 
     System.out.println("B = " + CONST_B); 
    } 

} 

アプローチ2:上記の方法のいずれかは、他の上の任意の種類の利点を有している場合

public class MyClass { 

    MyClass() { 
     System.out.println("A = " + MyInterface.CONST_A); 
     System.out.println("B = " + MyInterface.CONST_B); 
    } 

} 

私は思っていました。このような状況が発生する場所の1つがBlackberryで、ローカライズされたテキストが文字列のキーとのインターフェイスとして定義されているため、コードのさまざまな部分でキーを引数としてシステムAPIを呼び出す必要があります。例えば

定数の

答えて

4

を呼び出します定数。その理由は、多くのクラスがインタフェースを実装できるため、同じ定数に多くのアクセス・ポイントを提供できるからです。

質問に答えるために、私はむしろ2番目の解決方法を使用したいと思います。さらにうまくいけば、定数を最終クラスに入れて、定数へのアクセスポイントが1つしかないようにします。それはより明確になり、リファクタリングが容易になります。

+0

多くのクラスがそのインターフェイスを実装している場合、多くのクラスがそれらの文字列にアクセスする必要があるため、これらの定数へのアクセスポイントを多数作成するのは間違いありません。しかし、私はまだこれが悪いことであると確信していませんか?フィールドは最終的なものなので、すべてのアクセスポイントが実際に同じ値に変換されます。しかし、Emmerichが述べたように名前の競合が発生する可能性がありますが、TXT_xxxxなどの定数に適切なパターンが使用されている場合は、少なくともBlackberryでは問題にはなりません。 – aligf

+1

これは設計上の問題です。誰が定数を所有しているのかを定義する必要があります。それらが多くのクラスによって実装されたインターフェイスに格納されている場合、所有権は不明です:Interface.CONST、Class1.CONST、Class2.CONST ...はすべて同じ定数を参照します。リファクタリングと設計の明快さを簡単にするには、MyConsts.CONSTのような単一のクラスを使用してアクセスするほうがよいでしょう。 –

3

使用列挙(効果的なJavaの)

はそのように定義し、それをインターフェースに定数を置くとアクセスするために、これらのインタフェースを実装するために悪い習慣と考えられているKernelError.KE_UNDEFINED_CALLER

public enum KernelError { 
    KE_NO_ERROR(0), KE_UNDEFINED_SESSION(1), KE_UNDEFINED_CALLER(2), KE_SESSION_EXPIRED(
      3), KE_NULL_VALUE_IN_SESSION(4), KE_N0_SUCH_METHOD(5); 

    private KernelError(int errorCode) { 
     setErrorCode(errorCode); 

    } 

    private int errorCode; 

    /** 
    * @return the errorCode 
    */ 
    public int getErrorCode() { 
     return errorCode; 
    } 

    /** 
    * @param errorCode 
    *   the errorCode to set 
    */ 
    public void setErrorCode(int errorCode) { 
     this.errorCode = errorCode; 
    } 

} 
+0

興味深い提案に

interface Constants { static int A; static int B; } void foo() { System.out.println(Constants.A); } 

を好むが、「同等」の定数の場合に限ら:定数実際に可能例eunmerationです。問題では、これらの定数は、スレッドプールの例として、POOL_MAX_SIZEとTASK_CANCEL_DELAYになります。そのような場合、両方を同じ列挙型にすることは直感的ではなくなり、一定の列挙型を持つことは特に冗長なようです。 – Riduidel

+2

あなたの答えをありがとう。私はenumについて何かを学んだ!しかし、ブラックベリーにはenumがありません!さらに、あなたは私が示した方法でインターフェイスを実装するように強制されます。問題は本当にそれらの2つのアプローチについてだけです。 – aligf

+0

なぜ列挙型の名前の型に接頭辞を付けますか?この冗長性の利点は何ですか? – meriton

1

たとえば、MyInterface2を定義して定数をCONST_Aと定義した場合、それらは競合します。個人的には、アプローチ2は読みやすいと思います。

1

私はすべての可能な定数を使ってクラスの名前空間を汚染しないので、アプローチ2を好む。これにより、コード補完の選択肢が少なくなります。また、定数の使用を見るとき、修飾された名前は、それが定数であり、その定数が定義されていることを明示します。ある

は、私が

interface Constants { 
    static int Const_A; 
    static int Const_B; 
} 

void foo() { 
    System.out.println(Const_A); 
} 
関連する問題