【发布时间】:2022-01-11 15:44:21
【问题描述】:
我最近遇到了一些代码,其中在 abstract 类中定义了 public static 方法。我想知道这是否被认为是好的做法或反模式?
我制作了一个简单的示例程序来说明我的意思。
public abstract class StaticMethodsInAbstractClassesStudy {
public static int adder(int a, int b){
return a + b;
}
}
public class StaticMethodsInClassesStudy {
public static void main(String [] args){
System.out.println(StaticMethodsInAbstractClassesStudy.adder(2, 3));
}
}
当您运行代码时,您会得到 5 的结果,这证明我能够在 abstract 类中运行代码。
我故意不将extends 添加到StaticMethodsInClassesStudy 以强调完全可以直接在abstract 类中运行代码而无需实例化扩展类。
我个人认为这是一种不好的做法,因为您将abstract 类用作普通类,从而绕过了abstract 类的意图。这些类型的方法不应该保存在单独的“普通”java类中,例如实用类?
【问题讨论】:
-
如果您从不打算将
StaticMethodsInAbstractClassesStudy实例化(也就是说,StaticMethodsInAbstractClassesStudy的实例没有用处),则没有理由将其抽象化。使用私有构造函数使其成为最终类。 -
请定义“好的做法”和“坏的做法”。这些只是意见。
-
这真的取决于所涉及的方法,静态通常被人们首先进入编程领域滥用作为字段/方法访问的创可贴。通常,只要静态方法以不会修改某些内部(和静态)状态的方式使用,通常是静态的就可以了。总的来说,这取决于你的设计
-
另一件要考虑的事情:
static方法不是继承的,因此不能被子类覆盖。如果您打算覆盖它,那么它不能是static,如果您不希望它被覆盖,那么final比static更明确地为您执行此操作。 -
当然你可以在抽象类中运行代码。你只是不能实例化它们。静态初始化程序将是演示它的另一种方式,无需子类化或以其他方式弄乱您的示例。
标签: java