2012-01-04 4 views
0

こんにちは方法をスコープ:私は、次のメソッドを定義するクラスがあります。静的な実装では、Java

public String abstract getAnimalName(); 

そしてサブクラス

class Ralph extends Animal 
{ 
    public String getAnimalName(){return "RALPH";} 
} 

私は「ラルフ」のgetAnimalNameになりたいですスタティックなのは1つしかないので、ステートレス のRalphの名前のバージョンです。

したがって、インタフェースを満たしながら静的にgetAnimalNameを実装したいと考えています。これは可能ですか?おそらく、実行時に静的なものをプロキシすることによってオブジェクトの実装を提供するために依存性注入またはAOP技術を使用する方法がありますか?

明白な解決策(オブジェクトスコープメソッドを静的メソッドでラップする)は、私の好みのためにボイラープレートに少しです。

答えて

4

いいえ、あなたの最後の提案はあなたができることです。

これは、設計上何かが疑わしいと警告することがあります。

ラルフはインスタンスなので、getAnimalNameの契約に従う必要があります。

2

あなたは最高のやっているでしょう:

class Ralph extends Animal { 

    private static final String NAME = "RALPH"; 

    public String getAnimalName(){return NAME;} 
} 

をしたい場合にもNAMEを公表することができます。

+2

Ralphの外からアクセスできるようにするには、別のスコープに変更する必要があります。変更を防ぐためにNAMEを最終的にすることをおすすめします。 –

+0

もちろんそうです。答えで修正されました。 – yair

1

デザインを確認する必要があります。もしあなたがアーキテクチャに満足すれば、クラスをシングルトンにして、Ralph.getInstance()。getAnimalName()を使用します。

これについての注釈はおそらく考えられますか?

@Name("RALPH") 
class Ralph extends Animal 
{} 

あなたはClassオブジェクトをオフ注釈を引くことができます。http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations()

0

なぜあなたは、次の方法にあなたのコードを変更しないでください:

class Ralph extends Animal 
{ 
    public static String NAME = "RALPH"; 
} 

class Animal { 
    public static String NAME; 

} 

あなたgetAnimalNameは(使用以上のことを)メソッド。

+0

これは危険だと私は信じています。それはvarを上書きするのではなく隠すと信じていますか? – jayunit100

+0

あなたはおそらくNALAMEもRalphファイナルにしたいと思っています。 –

0

実際には、メソッドのインスタンスが複数あるという概念はありません。複数のRalphオブジェクトを作成すると、余分なメモリを追加することはありません。

ただし、メタタイプを作成することもできます。

関連する問題