2014-02-06 101 views
1

我已經閱讀了很多文章和文章,現在明白靜態方法不能被繼承。爲了解釋我的問題,你可以看看下面的代碼片段:Java - 返回靜態方法的繼承

主類:

public class DataTable { 
public String id; 
public String date; 

public String reserve() throws SQLException { 
    ...... 
    String query="insert into `" + this.getClass().getSimpleName() +"`() values()"; 
    ........ 
    String key = ...... 
    ....... 
    return key; 
} 
} 

一個子類:

public class Contact extends DataTable{ 
public String firstName; 
public String lastName; 
public String phoneNumber; 
    ........... 
} 

有了這個,如果我需要在某個時間點預定聯繫人,我需要寫:

Contact contact=new Contact(); 
String id = contact.reserve(); 

This Works。但我覺得這不是最佳。對我而言,第一行完全沒用。我會更喜歡寫作:

String id = Contact.reserve(); 

的代碼將是更清潔和我猜想,它會在運行時使用更少的資源,因爲它不會有,我們真的不需要建立聯繫的一個實例。但爲此,我應該:

  • 在每個子類中創建一個特定的reserve()靜態方法,並將其從主類中移除。我真的不認爲它會更好,因爲我會在大量的類中使用完全相同的代碼;
  • 或使reserve()靜態在主類中,並允許它訪問調用它的類名,這在java中似乎不可行。

我希望我的問題很清楚。任何想法如何處理?還是應該保持原樣?

+1

我不明白爲什麼你覺得它不是最優的:代碼是乾淨的,如果特定的'reserve'實現需要,你可以創建'Contact'的子類。甚至更好:將其作爲實用方法並傳遞所需的參數,而不是進行這種*'靜態'繼承*。 –

回答

4

不要爲「更清潔」而錯誤更少的代碼行。

代碼會更乾淨,我猜測它會在運行時使用更少的資源,因爲它不需要創建一個我們真正不需要的Contact實例。

我不同意。你顯然保留聯繫對象,而不是類,所以對該類的實例調用保留更有意義。當然,如果你想縮小這個下來一條線,你可以這樣做:

new Contact().reserve(); 

...取決於如果您需要重用的接觸對象可能會或可能不會再清楚不過了。不要陷入像這樣的情況下創建對象的開銷 - 好的風格更重要。除非你通知事情不夠快,那麼你沒有問題。

簡而言之,就是從上面的代碼中,聽起來對於我來說就像事情是完美無缺的。

1

如果它的所有有關的代碼冗餘線路,然後有什麼錯:

String id = new Contact().reserve(); 

當然,這是要創建一個聯繫對象每次調用。如果這是不能接受的,那麼爲什麼不使用單:

String id = Contact.instance.reserve(); 

這將永遠只能創建聯繫的一個實例,並具有不受靜態儲量的優勢。

0
public class DataTable { 
    //... 

    public static String reserve(Class clazz) throws SQLException {  
     ...... 
     String query="insert into `" + clazz.getSimpleName() +"`() values()"; 
     ........ 
     String key = ...... 
     ....... 
     return key; 
    } 
} 

那麼你可以這樣調用DataTable.reserve(Contact.class);

0

您的聯繫已經擴展數據表,所以你已經在聯繫儲備方法。現在,您可以覆蓋該方法,甚至寫新方法

public class Contact extends DataTable { 

    public String reserve() throws SQLException { 
     super.reserve(); 
     System.out.println("I override the super class"); 
    } 

} 

如果不擴展數據表,那麼你基本上是把它作爲一個工具讓你的DataTable具有類似

public class DataTable { 
    public static String doReserve(String id, Date date) { 
     // do your logic 
    } 
} 

和簡單的調用簽名來自Contact的靜態DataTable.doReserve方法。