在过去的十年左右,我一直在为我的Java实用程序类使用下面的模式。该类只包含静态方法和字段,声明为final
,因此不能进行扩展,并且具有private
构造函数,因此不能实例化。
public final class SomeUtilityClass {
public static final String SOME_CONSTANT = "Some constant";
private SomeUtilityClass() {}
public static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
现在,随着Java8中static methods in interfaces的引入,我最近发现自己在使用实用程序接口模式:
public interface SomeUtilityInterface {
String SOME_CONSTANT = "Some constant";
static Object someUtilityMethod(Object someParameter) {
/* ... */
return null;
}
}
这让我摆脱了构造函数,以及接口中隐含的大量关键字(public
、static
、final
)。
这种方法有什么缺点吗?在实用程序接口上使用实用程序类有什么好处吗?
发布于 2015-06-18 10:41:36
只有当你期望有人会实现它时,你才应该使用接口。例如,java.util.stream.Stream
接口有一组静态方法,这些方法可以位于Java8之前的某个Streams
或StreamUtils
类中。但是,它是一个有效的接口,它也具有非静态方法,并且可以实现。java.util.Comparable
是另一个例子:那里的所有静态方法都只支持接口。您不能禁止用户实现您的公共接口,但是对于实用程序类,您可以禁止他们实例化它。因此,为了代码的清晰度,我建议不要使用接口,除非它们是要实现的。
关于@saka1029答案的注释。虽然你不能在同一个接口中定义helper私有方法和常量,但是在像MyInterfaceHelper
这样的包中创建一个包私有类是没有问题的,它将拥有所有必要的实现相关的东西。一般来说,包私有类可以很好地向外部世界隐藏您的实现细节。
发布于 2015-06-18 10:21:37
您不应该使用接口。接口不能有私有常量和静态初始值设定项。
public class Utility {
private Utility() {}
public static final Map<String, Integer> MAP_CONSTANT;
static {
Map<String, Integer> map = new HashMap<>();
map.put("zero", 0);
map.put("one", 1);
map.put("three", 3);
MAP_CONSTANT = Collections.unmodifiableMap(map);
}
private static String PRIVATE_CONSTANT = "Hello, ";
public static String hello(String name) {
return PRIVATE_CONSTANT + name;
}
}
发布于 2015-06-18 10:02:48
我想它会起作用的。我认为在您的SomeUtilityInterface中,变量SOME_CONSTANT默认为静态最终,尽管您没有明确说明。所以,它可以作为一个实用程序工作,但是你不会有一些变化性的问题,你不会有一个常规的类,所有的成员变量都必须是final的?只要这不是默认方法的具体实现的问题,我就想不出有什么问题。
https://stackoverflow.com/questions/30905236
复制相似问题