具有匹配静态接口(interface)的 Java 实用程序单例

标签 java java-8 singleton static-methods

我想制作一组实现接口(interface)的实用程序类。为了做到这一点,我将使用单例模式。但是,如果能够通过静态方法调用来使用这些实用程序类,那就太好了。例如:

public interface IValidator<T> {
    boolean isValid(T value);
}

public class StringValidator implements IValidator<String> {
    public static final StringValidator instance = new StringValidator();

    @Override
    public boolean isValid(final String value) {
        return true;
    }
}

上面提供了一个单例,它使我能够使用接口(interface)调用实用方法,如下所示:

// Use case #1
IValidator<String> validator1 = StringValidator.instance;
validator1.isValid("");

// Use case #2
StringValidator.instance.isValid("");

但是,我还希望能够通过以下更简洁的方式使用StringValidator:

// Use case #3: How can I also allow this syntax?
StringValidator.isValid("");

Java 中有没有一种方法可以使上述所有三种语法都起作用,而无需重命名方法?我唯一的想法是向静态定义添加一个 varargs 参数,如下所示:

public class StringValidator implements IValidator<String> {
    public static final StringValidator instance = new StringValidator();

    @Override
    public boolean isValid(final String value) {
        return StringValidator.isValid(value);
    }

    public static boolean isValid(final String value, final Object... ignored) {
        return true;
    }
}

但是,失败并显示消息“无法从 StringValidator 类型对非静态方法 isValid(String) 进行静态引用”。同样,是否有某种方法可以使编译器允许我的所有三种用例语法?谢谢。

最佳答案

如果接口(interface)是函数式接口(interface),您可以删除单例

public class StringValidator {
    public static boolean isValid(final String value) {
        return ...;
    }
}

每当您需要 Validator<String> 的实例时使用静态方法的方法句柄:

IValidator<String> validator1 = StringValidator::isValid; 

关于具有匹配静态接口(interface)的 Java 实用程序单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36189739/

相关文章:

java - 将数据输入 Google Cloud Datastore

java - HSQLDB 意外标记 : GETDATE

reactjs - React Native-创建单例模式的最佳方式

c++ - 一遍又一遍传递对象的替代方法

java - 方法标题中的分号预期错误

Java lambda : Class with type?

java - 使用 orElseThrow 时出现循环接口(interface)错误

junit - 如何使用 EasyMock(不使用 Joda Time 和 PowerMock)将当前系统时间覆盖到 Java 8 Web 应用程序中的特定日期?

java - 将依赖项注入(inject)到 Singleton 类中

java - Exceptionmapper 未在 JAX-RS Jersey 中被调用