Java 8:扩展class静态方法好还是直接调用静态方法好?
Java 8: Better to extend class of static methods or better to call static methods directly?
我正在将一些旧的 Java 4 代码更新为 Java 8(太多了,无法粘贴到这里)并且最初的程序员选择让他们的几乎每个 class 扩展这个巨大的 class 充满了静态方法和常量,但我不知道他们的推理。
例如:
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.");
}
}
我的问题是...是保留这种设计更好还是删除静态 methods/constants 的继承并简单地静态调用那些 methods/constants 更好?
"Better" 对我来说被定义为较低的内存消耗(同样,这个基础 class 相当大)因为 CPU 可能不受此影响。这种方法的benefits/pitfalls是什么?
我担心的是,因为 BaseClass 是如此之大,以至于我在继承 classes 中只使用一两个 methods/constants 浪费了很多内存,我可以调用静态的。
静态成员本身不是 "inherited"。他们住在基地 class 上,不管他们从哪个子 class 被调用,所以我怀疑是否有任何记忆影响。
将所有 class 对象创建为该通用 class 的子 class 的原因只是为了方便地访问没有限定 class 名称的静态成员。一个常见的变体是从声明一堆静态字段的接口继承。好处是实现一个接口不会像 superclass 那样干扰继承(你只能扩展一个 superclass)。缺点是 Java 8 之前无法在接口上声明静态方法。
无论如何,这个技巧通常被认为是一种反模式,并已被 static imports 取代。
继承是为子 class 定制父 class 的行为。
静态方法不能被继承,它们的行为不会因对象的状态而改变。
所以你不能让一些东西是静态的和可继承的。扩展 class 的完整静态方法是没有意义的。此外,这不会改变内存使用的大小。您的 classes 已经加载。
上面有会员写的漂亮见解。如果有助于理解,我想换个说法。
继承:
父classes的所有成员变量和函数都包含在子class中,基于可见性运算符(public, private , protected )
静态成员:
class 的静态成员存储在 class 的所有实例变量都可以访问的内存中。这就像属于那个 class
的所有实例变量的共享空间
现在谈到静态变量和函数的继承,总是建议使用静态导入。
我正在将一些旧的 Java 4 代码更新为 Java 8(太多了,无法粘贴到这里)并且最初的程序员选择让他们的几乎每个 class 扩展这个巨大的 class 充满了静态方法和常量,但我不知道他们的推理。
例如:
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.");
}
}
我的问题是...是保留这种设计更好还是删除静态 methods/constants 的继承并简单地静态调用那些 methods/constants 更好?
"Better" 对我来说被定义为较低的内存消耗(同样,这个基础 class 相当大)因为 CPU 可能不受此影响。这种方法的benefits/pitfalls是什么?
我担心的是,因为 BaseClass 是如此之大,以至于我在继承 classes 中只使用一两个 methods/constants 浪费了很多内存,我可以调用静态的。
静态成员本身不是 "inherited"。他们住在基地 class 上,不管他们从哪个子 class 被调用,所以我怀疑是否有任何记忆影响。
将所有 class 对象创建为该通用 class 的子 class 的原因只是为了方便地访问没有限定 class 名称的静态成员。一个常见的变体是从声明一堆静态字段的接口继承。好处是实现一个接口不会像 superclass 那样干扰继承(你只能扩展一个 superclass)。缺点是 Java 8 之前无法在接口上声明静态方法。
无论如何,这个技巧通常被认为是一种反模式,并已被 static imports 取代。
继承是为子 class 定制父 class 的行为。
静态方法不能被继承,它们的行为不会因对象的状态而改变。
所以你不能让一些东西是静态的和可继承的。扩展 class 的完整静态方法是没有意义的。此外,这不会改变内存使用的大小。您的 classes 已经加载。
上面有会员写的漂亮见解。如果有助于理解,我想换个说法。
继承: 父classes的所有成员变量和函数都包含在子class中,基于可见性运算符(public, private , protected )
静态成员: class 的静态成员存储在 class 的所有实例变量都可以访问的内存中。这就像属于那个 class
的所有实例变量的共享空间现在谈到静态变量和函数的继承,总是建议使用静态导入。