Java 8:更好地扩展静态方法类或更好地直接调用静态方法?

时间:2016-03-14 00:47:09

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

我将一些旧的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非常庞大,以至于我在继承类中只使用一两个方法/常量浪费了大量内存,我可以静态调用它。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

继承是为子类自定义父类的行为。

无法继承静态方法,并且由于对象的状态,它们的行为不会更改。

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

答案 2 :(得分:0)

上面有成员提出的美丽见解。如果它有助于理解,我想用不同的词语。

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

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

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