首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java8中,接口是实用程序类的有效替代品吗?

在Java8中,接口是实用程序类的有效替代品吗?
EN

Stack Overflow用户
提问于 2015-06-18 09:51:37
回答 3查看 9.1K关注 0票数 26

在过去的十年左右,我一直在为我的Java实用程序类使用下面的模式。该类只包含静态方法和字段,声明为final,因此不能进行扩展,并且具有private构造函数,因此不能实例化。

代码语言:javascript
复制
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的引入,我最近发现自己在使用实用程序接口模式:

代码语言:javascript
复制
public interface SomeUtilityInterface {
    String SOME_CONSTANT = "Some constant";

    static Object someUtilityMethod(Object someParameter) {
        /* ... */

        return null;
    }
}

这让我摆脱了构造函数,以及接口中隐含的大量关键字(publicstaticfinal)。

这种方法有什么缺点吗?在实用程序接口上使用实用程序类有什么好处吗?

EN

回答 3

Stack Overflow用户

发布于 2015-06-18 10:41:36

只有当你期望有人会实现它时,你才应该使用接口。例如,java.util.stream.Stream接口有一组静态方法,这些方法可以位于Java8之前的某个StreamsStreamUtils类中。但是,它是一个有效的接口,它也具有非静态方法,并且可以实现。java.util.Comparable是另一个例子:那里的所有静态方法都只支持接口。您不能禁止用户实现您的公共接口,但是对于实用程序类,您可以禁止他们实例化它。因此,为了代码的清晰度,我建议不要使用接口,除非它们是要实现的。

关于@saka1029答案的注释。虽然你不能在同一个接口中定义helper私有方法和常量,但是在像MyInterfaceHelper这样的包中创建一个包私有类是没有问题的,它将拥有所有必要的实现相关的东西。一般来说,包私有类可以很好地向外部世界隐藏您的实现细节。

票数 11
EN

Stack Overflow用户

发布于 2015-06-18 10:21:37

您不应该使用接口。接口不能有私有常量和静态初始值设定项。

代码语言:javascript
复制
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;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-18 10:02:48

我想它会起作用的。我认为在您的SomeUtilityInterface中,变量SOME_CONSTANT默认为静态最终,尽管您没有明确说明。所以,它可以作为一个实用程序工作,但是你不会有一些变化性的问题,你不会有一个常规的类,所有的成员变量都必须是final的?只要这不是默认方法的具体实现的问题,我就想不出有什么问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30905236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档