【发布时间】:2016-07-11 10:14:37
【问题描述】:
我想制作一组实现接口的实用程序类。为了做到这一点,我将使用单例模式。但是,如果能够通过静态方法调用来使用这些实用程序类,那就太好了。例如:
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;
}
}
但是,失败并显示消息“无法从 StringValidator 类型对非静态方法 isValid(String) 进行静态引用”。同样,有没有办法让编译器允许我的所有三种用例语法?谢谢。
【问题讨论】:
-
我没想到会这样。一般来说,处理这个问题的方法是从类中静态导入实例......
-
StringValidator.instance.isValid("");有什么问题?
标签: java java-8 singleton static-methods