【问题标题】:extending a class whose members are all static扩展一个成员都是静态的类
【发布时间】:2015-06-19 10:54:57
【问题描述】:

扩展一个方法都是静态的 Java 类有意义吗?

public class Parent{
  public static String child1(long numb){...};
  public static MyData child2(String str){...};
  ...
}

public class More extends Parent{...}

【问题讨论】:

  • 当然可以,这取决于您的需要
  • 我看不出有什么不同
  • @JGerulskis 有,因为静态方法不能像实例方法那样被覆盖。
  • @hexafraction 您不能以任何方式覆盖静态方法。这会有什么好处?无法覆盖静态方法不会增加任何好处,而是会产生负面影响。
  • 我从来没有说过有好处。根据我回复的评论的措辞,我说存在差异。

标签: java static extend


【解决方案1】:

只有静态成员函数的类通常是实用程序类,即它们为操作其他相关对象的函数提供分组。例如,Files 类提供了处理File 对象的功能,而apache commons ArrayUtils 提供了处理T[] 的工具。

我见过的扩展实用程序类的唯一合理案例是减少与第 3 方实用程序类的耦合。 (这在我看来是一个相对薄弱的理由)。

假设您使用了一些第 3 方 Foo 实用程序

public class YourFooUtilities {
  public static void makeAFooSing(Foo f) {...}
}

但你还需要有一些内部的Foo 实用程序,然后你可以这样做:

public class MyFooUtilities extends YourFooUtilities {
    public static void makeAFooDance(Foo f) { ... }
    public static void makeAFooDanceAndSing(Foo f) { 
       makeAFooDance(f);
       makeAFooSing(f);
    }
}

那么你对YourFooUtilities的使用总是可以通过MyFooUtilites,给一个抽象层

static import MyFooUtilities.*;

public static class MainClass {    
  void doSomething() {
     Foo f = new Foo();
     makeFooDance(f);
     makeFooSing(f);
     makeAFooDanceAndSing(f);
  }
}

这使您的代码(稍微)不那么紧密地绑定到第 3 方代码。

【讨论】:

    【解决方案2】:

    我认为下面提到的很少:

    1. 如果类中的所有方法都是静态的,则可以将类设为单例,这样可以节省大量空间。
    2. 您可以非常有效地使用template method design pattern,其中一些继承类可以定义其特定的东西
    3. 对于没有实例变量的类,不需要同步。因此,您的类可以被 N 个线程访问,而无需担心并发处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多