Java 8:扩展静态方法的类更好还是直接调用静态方法更好?

问题描述 投票:0回答:4

我正在将一些旧的 Java 4 代码更新为 Java 8(太多了,无法粘贴到此处),并且原始程序员选择让几乎每个类都扩展这个仅包含静态方法和常量的巨大类,但我不这样做了解他们的推理。

例如:

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
4个回答
6
投票

静态成员本身并不是“继承的”。无论从哪个子类调用它们,它们都生活在基类上,所以我怀疑是否有任何内存影响。

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

无论如何,这个技巧通常被认为是一种反模式,并已被 静态导入所取代。


1
投票

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

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

所以你不能使某些东西静态且可继承。扩展一个完全静态方法的类是没有意义的。此外,这不会改变内存使用的大小。您的课程已经加载。


0
投票

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

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

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

现在谈到静态变量和函数的继承,始终建议进行静态导入。


0
投票

前面的所有答案都非常有用,我只想添加一个简单的观点,支持NOT使用实现静态方法的类的继承:在该类中添加成员变得非常诱人,突然之间变为非静态,它会在派生它的实例之间创建依赖关系,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.