【问题标题】:What should the declaration of a helper class, with only static methods, be?仅具有静态方法的辅助类的声明应该是什么?
【发布时间】:2014-05-06 01:27:50
【问题描述】:

我这里有一个类,它只包含static 方法,所以我称之为帮助类,一个例子:

public class FileUtils {
    public static String readFileEntry(final Path path, final String entryKey) throws IOException { }

    public static String readAndModifyFileEntry(final Path path, final String entryKey, final UnaryOperator<String> operator) throws IOException { }
}

我应该如何声明类(abstractfinalstatic 等),这样就无法实例化该类?因为你不应该这样做。
如果这不可能,那么最佳做法是什么?

如果有任何额外帮助,我正在使用 Java 8。

【问题讨论】:

标签: java static helper


【解决方案1】:

您可以将构造函数声明为私有并使用 final 关键字来防止扩展:

public final class FileUtils {
    private FileUtils() {
    }

    public static String readFileEntry(final Path path, final String entryKey) throws IOException { }

    public static String readAndModifyFileEntry(final Path path, final String entryKey, final UnaryOperator<String> operator) throws IOException { }
}

【讨论】:

  • 声明方法final还有其他好处吗?
  • 在您的情况下否,因为您的课程无法扩展
  • 而且 - 由于静态方法在编译时绑定 - final 不会对静态方法做任何事情。
  • @Seelenvirtuose 它可以防止子类隐藏它们,但是由于他的类是最终的,因此不需要最终的
  • 另外——因为我有点偏执——我在构造函数中做了一个“throw new AssertionError(FileUtils.class)”。这表明即使使用反射,您也无法实例化该类。
【解决方案2】:

这是一种常见的模式:

public final class Helper {

    private Helper() {}

}

【讨论】:

    【解决方案3】:

    我会创建类final 只是作为预防措施,所以没有身体会错误地扩展。 更重要的是,我会添加一个私有构造函数,所以它不能被实例化:

    public final class FileUtils {
    
        /** Empty private constructor, just to prohibit instantiation */
        private FileUtils() {}
    
        // Rest of the class...
    }
    

    【讨论】:

      【解决方案4】:

      static 修饰符仅与内部类相关,不会阻止其实例化。 final 修饰符防止类扩展,但不影响创建实例的能力。 abstract 修饰符确实可以防止创建类的实例。将纯实用程序类标记为abstract 可能是一个好习惯。防止类实例化的其他方法是创建私有构造函数:

      public class FileUtils {
          private FileUtils() {
              // empty constructor needed just to make it impossible to write new FileUtils()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多