具有匹配静态接口的Java Utility Singleton

时间:2016-03-23 22:15:56

标签: java java-8 singleton static-methods

我想创建一组实现接口的实用程序类。为了做到这一点,我将使用单例模式。但是,能够通过静态方法调用使用这些实用程序类也是很好的。例如:

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;
    }
}

上面提供了一个单例,它允许我使用接口调用实用程序方法,如下所示:

// 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;
    }
}

然而,失败的消息&#34;无法从类型StringValidator&#34;中对非静态方法isValid(String)进行静态引用。再次,有没有办法让编译器允许我的所有三个用例语法?感谢。

2 个答案:

答案 0 :(得分:3)

如果界面是功能界面,您可以删除单身

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

并且只要您需要Validator<String>的实例,请使用静态方法的方法句柄:

IValidator<String> validator1 = StringValidator::isValid; 

答案 1 :(得分:-1)

我找到了办法。将代码更改为以下内容:

public interface IValidator<T> {
    boolean isValid(T value, Object... ignored);
}

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

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

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

然后编译所有三个用例。 Java将为用例#2生成警告,但这并不会让我感到困扰,因为我认为实现类的唯一合理用途是#1和#3。

相关问题