2015-11-03 82 views
4

今天我正在考慮爲不同對象所需的通用功能編寫較少代碼的好方法。Java 8中接口的默認方法中使用的陰影變量

繼承可以完成這項工作,但這些類將無法繼承其他任何人,所以我選擇了接口。

所以,我有我的功能,我會需要一些對象接口:

public interface Test { 
    String message = "Hello from Interface!"; 

    default void printMessage() { 
     System.out.println(message); 
    } 
} 

,然後我可以在任何物體使用它,而不必重寫/寫任何代碼不僅僅是簡單地調用方法更當需要時:

public class TestingTest implements Test { 

    public String message = "Hello from Class!"; 

    public TestingTest() { 
     printMessage(); 
    } 

    public static void main(String[] args) { 
     new TestingTest(); 
    } 
} 

它的作品就像一個魅力!但是......然後我想,如果我希望這些對象中的某些指定不同的消息而不需要(可選),那麼我首先想到的就是對接口變量進行遮蔽,但它不起作用,默認方法繼續使用來自接口的變量而不是類變量(它影響它)。

解決方案當然是重載接口中的printMessage方法,以便在用戶需要指定消息時接收消息作爲參數,但有沒有更優雅的方法?就像只是在課堂上宣佈一條新消息一樣?

謝謝先進。

+0

你可以去[反思]( http://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection),但這種選擇會更糟,然後試圖影響變量,因爲它可能導致討厭的錯誤。 – SomeJavaGuy

+0

我同意你的看法,反思應該是最後的手段! –

+2

如何創建一個默認的'getMessage()'並覆蓋它? – Tunaki

回答

3

接口中的String messagestatic(AFAIK)。所以這個方案不起作用。

你可能會做一些事情(醜)爲:

default void printMessage(String... messages) { 
    if (messages.length == 0) { 
     messages = new String[] { "arrgg" }; 
    } 
    System.out.println(messages[0]); 
} 

領域有產業,所以價值只能從可重寫的方法阻止像

public String message() { return "..."; } 
+0

這將相當於超載的方法,我認爲 –

+1

是添加到答案。 –

+0

@Joop Eggen:字段沒有繼承權?如果訪問是公共的或受保護的,則字段可以是繼承。 – Loc