2016-10-05 33 views
0

在基類中存儲對子實例字段的引用有什麼好處,而不是在基類中訪問時總是調用抽象的getter?存儲對子變量的引用的基類?

假設我有一個基類象下面這樣:

public abstract class BaseClass { 
    abstract String getText(); 

    public void printText() { 
     System.out.println(getText()); 
    } 
} 

和子類了下方的getText()返回一個字段,它永遠不會改變。

public ChildClass extends BaseClass { 
     private String text = "blah"; 

     @Override 
     public String getText() { 
      return text; 
     } 
    } 

轉換爲下面的代碼有什麼優點/缺點嗎?

public abstract class BaseClass { 
    abstract String getText(); 

    private String text; 

    public void printText() { 
     System.out.println(text); 
    } 

    @PostConstruct 
    public void postConstruct() { 
     this.text = getText(); 
    } 
} 
+0

這取決於您是否期望'getText()'是一個昂貴的通話,以及它是否可以在不同的通話中返回不同的結果。 – shmosel

回答

0

關於使用PostConstruct,我會向您推薦this question詳細說明那部分,但本質上與依賴注入/多態方法的組合是有道理的使用它,以確保你有一個完全初始化對象。

一般而言,我會說你建議的兩種方法是不相同的,因爲類有不同的行爲。對於第二堂課,保證每次打電話給printText()都會打印相同的文本,而對於第一個版本,由於getText()的實施委託給實施的子級,所以文本可能每次都會有所不同。因此,第二個版本不變,第一個版本不變。無論這是否合意,都是需要在具體背景下評估的另一個問題。