2014-02-06 59 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方法。