2016-03-14 61 views
3

我正在將一些舊的Java 4代碼更新到Java 8(這裏粘貼的方式太多了),而原始程序員幾乎選擇了他們的每個類擴展這個僅包含靜態方法和常量的單個HUGE類,但我確實不知道他們的推理。Java 8:更好地擴展靜態方法的類或更好地直接調用靜態方法?

例如:

public class BaseClass{ 
    /* this class has a huge amount of ONLY static methods/constants */ 

    public static final int STUFF_DONE = 1; 

    public static String getStuff(){ 
      String stuff = "this is my stuff."; 
      return stuff; 
    } 
    ... 
} 

public class SuperClass extends BaseClass{ 
    /* this class has only a few methods */ 
    public String labelStuff(){ 
      return getStuff(); 
    } 
} 

public class MyClass extends SuperClass{ 
    /* there are many classes that extend SuperClass like this one */ 
    public int handleStuff(){ 
      String myString = labelStuff(); 
      return STUFF_DONE; 
    } 
    public static void main(){ 
      if(handleStuff()) System.out.println("Done."); 
    } 
} 

我的問題是...是更好地保持這樣的設計還是較好的去除靜態方法/常量的繼承和簡單地靜態地調用這些方法/常量?

對我而言,「更好」被定義爲內存消耗更低(同樣,這個基類非常大),因爲CPU可能不會受到此影響。這種方法有哪些好處/缺陷?

我擔心的是,因爲BaseClass非常龐大,我只能在靜態調用的繼承類中只使用一個或兩個方法/常量,浪費了大量內存。

回答

6

靜態成員本身不是「繼承的」。無論從哪個子類中調用它們,它們都生活在基類上,所以我懷疑它會影響內存。

創建所有類作爲此公共類的子類的原因僅僅是爲了方便地訪問不具有限定類名稱的靜態成員。一個常見的變體是從聲明一堆靜態字段的接口繼承。好處是實現一個接口不會像超類那樣干擾繼承(你只能擴展一個超類)。缺點是,直到Java 8不可能在接口上聲明靜態方法。

在任何情況下,這個技巧通常被認爲是反模式,並已被static imports所取代。

+1

爲什麼它是反模式有很多原因,但這個答案基本上是正確的:這是一個非常糟糕的做法,它應該被取消。一個主要原因是它將每個類與靜態方法超類聯繫起來。而這些類別中的任何一個都不能延伸其他任何東西 – VGR

+2

Java 5中引入了關於Java 4代碼和靜態導入問題的事實解釋了動機(儘管即使在Java 5子類化中易於導入也被認爲是反模式)。不過,值得考慮的是將龐大的類拆分爲幾個較小的類,也許按主題分離實用方法,因爲當使用靜態導入而不是繼承時,Java的單一繼承不再是問題。 – Holger

1

繼承是自定義子類的父類的行爲。

靜態方法不能被繼承,並且由於對象的狀態,它們的行爲不會改變。

所以你不能讓一些東西是靜態的和可繼承的。沒有意義擴展一類完整的靜態方法。此外,這不會更改內存使用的大小。你的課程已經加載完畢。

0

有成員在上面寫的美麗見解。如果它有助於理解,我想用不同的詞來表達。

繼承: 所有父類的成員變量和函數都是基於可視性操作包含在子類(公共,私有,保護)

靜態成員: 類的靜態成員被存儲在存儲器對類的所有實例變量都可訪問。它就像屬於該類的所有實例變量的共享間隔

現在來靜態變量和函數的繼承,建議靜態導入。

相關問題