抽象类中的静态方法?



我最近从一个视频中学到,如果一个Java类的所有方法出于性能原因都是静态的,那么把它变成抽象类是一个很好的实践。

谁能解释一下为什么会这样?

这可能会阻止人们创建类的实例。Java代码被期望创建大量在短时间内有用并被垃圾收集的对象,因此很难说这是任何实质性的性能优势。它似乎更像是一种传达类背后意图的方式。

另一种选择是,不将类定义为抽象类,而是将类定义为final类。这是JDK代码中采用的方法,例如:java.lang.Math:

public final class Math {
    /**
     * Don't let anyone instantiate this class.
     */
    private Math() {}
无论使用哪一种方法,都应该给类一个私有构造函数。这可以防止任何人实例化它,并明确类的目的是为静态方法提供一个家。这里的缺点是代码覆盖工具倾向于将构造函数报告为未覆盖的。

从Java 8开始,第三种选择是将静态方法放在接口上。任何具有非默认实现的方法都被假定为静态方法。这种方法的优点是不需要将构造函数设为私有,并且代码覆盖工具会很满意。

使用抽象类(但没有私有构造函数)或接口,还可以扩展或实现类型,以使所有静态方法可用,而无需静态导入。请参阅此链接以获取示例。对于java.lang.Math方法,这不是一个选项。

如果它具有静态方法,则不必将其设置为抽象。如果你把它变成一个抽象类,那么没有人可以实例化这个类。

另一方面,你可以用私有构造函数声明一个类,所以没有人,甚至是子类,可以实例化你的类的实例。

 public class A
 {
    private A()
    {
       throw new RuntimeException("Instantiation of MyUtility is not 
       allowed!");
     }
    public static void aMethod()
    {
      // Your method here.
    }
  }

最新更新