【问题标题】:Java - Back to inheritance of static methodsJava - 回到静态方法的继承
【发布时间】:2014-03-03 17:21:44
【问题描述】:

我阅读了很多帖子和文章,现在明白了静态方法不能被继承。为了解释我的问题,您可以查看以下代码:

主类:

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();

这行得通。但我发现它不是最优的。对我来说,第一行完全没用。我更喜欢写作:

String id = Contact.reserve();

代码会更简洁,我猜它会在运行时使用更少的资源,因为它不必创建我们真正不需要的 Contact 实例。但为此,我应该:

  • 在每个子类中创建一个特定的reserve() 静态方法并将其从主类中移除。我真的不认为它更好,因为我会在大量类中拥有完全相同的代码;
  • 或在主类中将reserve()设为静态,并允许它访问调用它的类名,这在java中似乎不可行。

我希望我的问题足够清楚。关于如何处理的任何想法?还是我应该保持原样?

【问题讨论】:

  • 我真的不明白为什么你觉得它不是最优的:代码很干净,如果需要特定的reserve 实现,你可以创建Contact 的子类。甚至更好:将其作为实用方法并传递所需的参数,而不是进行这样的 static 继承。

标签: java inheritance static classname


【解决方案1】:

不要将更少的代码行误认为是“更干净”。

代码会更简洁,我猜它会在运行时使用更少的资源,因为它不必创建我们真正不需要的 Contact 实例。

我不同意。您显然是在保留联系人object,而不是类,因此在该类的实例上调用reserve 更有意义。当然,如果您想将其缩小到一行,您可以这样做:

new Contact().reserve();

...这可能会或可能不会更清楚,具体取决于您是否需要重用联系人对象。在这种情况下不要陷入创建对象的开销中——好的风格更重要。除非您注意到这种方式不够快,否则您没有遇到问题。

简而言之,从上面的代码来看,在我看来事情就像现在这样完美无缺。

【讨论】:

    【解决方案2】:

    如果都是多余的代码行,那么有什么问题:

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

    当然,每次调用都会创建一个 Contact 对象。如果这不可接受,那么为什么不使用单例:

    String id = Contact.instance.reserve();
    

    这只会创建一个联系人实例,并且具有保留不是静态的优点。

    【讨论】:

      【解决方案3】:
      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);

      【讨论】:

        【解决方案4】:

        您的联系人已经扩展了 DataTable,因此您在联系人中已经有了一个保留方法。您现在可以覆盖该方法,甚至可以编写新方法

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

        如果您不扩展 DataTable,那么您实际上将其视为实用程序,因此您的 DataTable 具有类似于

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

        并简单地从 Contact 静态调用 DataTable.doReserve 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-04
          • 2012-06-21
          • 2015-03-20
          • 1970-01-01
          • 2011-06-26
          相关资源
          最近更新 更多