【问题标题】:Java 8: Better to extend class of static methods or better to call static methods directly?Java 8:更好地扩展静态方法类还是更好地直接调用静态方法?
【发布时间】:2016-03-14 00:47:09
【问题描述】:

我正在将一些旧的 Java 4 代码更新为 Java 8(此处粘贴太多了),最初的程序员选择让他们的几乎每个类都扩展这个只有静态方法和常量的单个 HUGE 类,但我不知道他们的推理。

例如:

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 太大了,以至于我浪费了大量内存来仅使用继承类中的一两个方法/常量,而我只能静态调用这些方法/常量。

【问题讨论】:

    标签: java inheritance memory java-8 static-methods


    【解决方案1】:

    静态成员本身并不是“继承的”。无论从哪个子类调用它们,它们都存在于基类中,因此我怀疑是否会影响内存。

    将所有类创建为这个公共类的子类的原因只是为了方便访问没有限定类名的静态成员。一个常见的变体是从声明一堆静态字段的接口继承。好处是实现接口不会像超类那样干扰继承(您只能扩展单个超类)。缺点是在 Java 8 之前无法在接口上声明静态方法。

    无论如何,这个技巧通常被认为是一种反模式,并已被static imports 取代。

    【讨论】:

    • 它是反模式的原因还有很多,但这个答案基本上是正确的:这是一个非常糟糕的做法,应该撤消。一个主要原因是它将每个类都耦合到静态方法超类。而且这些类都不能扩展其他任何东西。
    • 问题是关于 Java 4 代码和 Java 5 中引入的静态导入这一事实解释了其动机(尽管在 Java 5 为便于导入而进行子类化之前被认为是一种反模式)。尽管如此,还是值得考虑将大类拆分成几个较小的类,或许可以按主题将实用方法分开,因为当使用静态导入而不是继承时,Java 的单一继承不再是问题。
    【解决方案2】:

    继承就是为子类定制父类的行为。

    静态方法不能被继承,并且它们的行为不会因为对象的状态而改变。

    因此,您不能使某些东西成为静态和可继承的。扩展一类全静态方法是没有意义的。此外,这不会改变内存使用的大小。您的类已经加载。

    【讨论】:

      【解决方案3】:

      上面有会员写的美丽见解。如果它有助于理解,我想用不同的词来表达。

      继承: 父类的所有成员变量和函数都包含在基于可见性运算符(public、private、protected)的子类中

      静态成员: 类的静态成员存储在类的所有实例变量可访问的内存中。这就像属于该类的所有实例变量的共享空间

      现在谈到静态变量和函数的继承,总是建议使用静态导入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        相关资源
        最近更新 更多