Java 只有静态方法的helper类的声明应该是什么?

Java 只有静态方法的helper类的声明应该是什么?,java,static,helper,Java,Static,Helper,我这里有一个类,它只包含静态方法,所以我称它为helper类,例如: 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,

我这里有一个类,它只包含
静态
方法,所以我称它为helper类,例如:

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 { }
}
公共类FileUtils{
公共静态字符串readFileEntry(最终路径路径,最终字符串entryKey)引发IOException{}
公共静态字符串readAndModifyFileEntry(最终路径路径、最终字符串entryKey、最终一元运算符)引发IOException{}
}
我应该如何声明类(
abstract
final
static
,等等),以便无法实例化该类?因为你不应该这样做。
如果不可能,那么最佳做法是什么


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

您可以将构造函数声明为private,并使用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 { }
}
公共最终类文件utils{
私有文件utils(){
}
公共静态字符串readFileEntry(最终路径路径,最终字符串entryKey)引发IOException{}
公共静态字符串readAndModifyFileEntry(最终路径路径、最终字符串entryKey、最终一元运算符)引发IOException{}
}

这是一种常见的模式:

public final class Helper {

    private Helper() {}

}

作为预防措施,我会将类设置为final,这样就不会有主体错误地扩展。 更重要的是,我要添加一个私有构造函数,这样它就不能被实例化:

public final class FileUtils {

    /** Empty private constructor, just to prohibit instantiation */
    private FileUtils() {}

    // Rest of the class...
}

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

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

同时声明方法
final
,是否还有其他好处?在您的情况下,否是因为您的类无法扩展,并且-由于静态方法是在编译时绑定的-final对静态方法没有任何作用。@Seelenvirtuose它可以防止子类隐藏它们,但由于他的类是final,因此不需要最后,由于我有点偏执,我在构造函数中执行“抛出新的断言错误(FileUtils.class)”。这表明,即使使用反射,也无法实例化该类。@MohammadAdil这是Java,不是C#,因此不必使用相同的修饰符组合。哦,抱歉。。