2012-01-04 64 views
0

喜範圍的方法:我有定義以下方法的類:靜態執行對象的Java中

public String abstract getAnimalName(); 

而且一個子類

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

我想「拉爾夫」的getAnimalName是靜態的,因爲只有一個,無狀態的 版本的拉爾夫的名字。

因此,我想靜態實現getAnimalName,同時仍然滿足接口。這可能嗎 ?也許,有沒有一種方法可以使用依賴注入或AOP技術通過在運行時代理靜態代碼來提供對象實現?

明顯的解決方案(使用對象作用域方法包裝一個靜態方法)對我的口味來說有一點鍋爐般的平衡。

回答

4

不,你最後的建議是你所能做的。

這可能是一個警告,說明設計中存在可疑的情況。

拉爾夫是一個實例,因此需要服從getAnimalName的合同。

2

你最好這樣做的:

class Ralph extends Animal { 

    private static final String NAME = "RALPH"; 

    public String getAnimalName(){return NAME;} 
} 

您還可以使公衆NAME如果你想要的。

+2

因爲它可以在Ralph之外訪問,所以你需要它到另一個範圍 - 並且我建議使NAME最終以防止修改。 – 2012-01-04 21:47:05

+0

你說得對,當然。修復了答案。 – yair 2012-01-05 07:47:09

1

設計需要進行肯定的審查。如果您對架構感到滿意,我會將該類轉換爲單例,並使用Ralph.getInstance()。getAnimalName()。

也許考慮這個註釋?

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

你可以拉斷的Class對象註釋:

0

爲什麼你不改變你的代碼到下一個方式http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations():

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

class Animal { 
    public static String NAME; 

} 

超過使用getAnimalName( )方法。

+0

我認爲這是危險的,我相信它隱藏而不是覆蓋var? – jayunit100 2012-01-05 00:10:02

+0

您可能還想在拉爾夫決賽中取得名稱。 – 2012-01-05 00:24:48

0

實際上並沒有超過一個方法實例的概念。當您創建多個Ralph對象時,它不會添加任何額外的內存。

但是,您可能想要創建元類型。