首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口:使用收益

接口:使用收益
EN

Stack Overflow用户
提问于 2012-04-04 04:08:08
回答 2查看 123关注 0票数 0

首先,我最喜欢的语言是PHP,我正在考虑学习Java。

因此,让我将我的问题分成两个密切相关的部分。

这是第一部分。

假设我有一个域模型类。它有一些getter,setter,一些查询方法等,我希望有一天能有机会对它们进行比较。所以它看起来是这样的:

代码语言:javascript
运行
复制
class MyEntity extends AbstractEntity
{
    public function getId()
    {
        // get id property
    }

    public function setId($id)
    {
        // set id property
    }

    // plenty of other methods that set or retrieve data

    public function compareTo(MyEntity $anotherEntity)
    {
        // some compare logic
    }
}

如果是Java,我就应该实现一个Comparable接口。但是为什么呢?多态性?可读性?还是别的什么?如果是PHP,我应该为自己创建Comparable接口吗?

这就是第二部分。

我的同事告诉我,Java中的一条经验法则是为类的每个行为方面创建一个接口。例如,如果我想将这个对象表示为一个字符串,我应该通过类似implements Stringable这样的内容来说明这种行为,如果是PHP,Stringable将如下所示:

代码语言:javascript
运行
复制
interface Stringable
{
    public function __toString();
}

这真的是一个经验法则吗?这种方法有什么好处?在PHP中值得这样做吗?在Java中呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-04 04:11:01

如果它是Java,我应该实现一个类似的接口。但是为什么呢?

那么,您已经提供了一种将"this“与另一个实例进行比较的方法……如果你实现了Comparable,你就是在告诉系统的其余部分你支持这种能力,这样比较就可以用于排序,找到“最大”或“最小”值等。所有这些都是在对你的类型一无所知的例程中。

我的同事告诉我,在

中,为类的每个行为方面创建一个接口是一条经验法则。

对我来说,这听起来有点过火。(您的示例不是很好,因为Object上已经有toString()了。)不要随意创建没有目的的接口--如果你想让那些不需要知道你的具体类型,只需要知道它支持什么的代码使用这种行为,就可以创建它们。一个很好的例子就是可测试性--如果你写了一个" authenticator“类,那么你可以想象在你的产品代码中交换不同的身份验证器,或者在测试其他使用身份验证的组件时模拟/伪造这个身份验证器。

票数 6
EN

Stack Overflow用户

发布于 2012-04-04 04:31:58

实现Comparable的一个非常实际的原因是能够做如下事情

代码语言:javascript
运行
复制
List<MyEntity> entities = // ( initialize and populate )

Collections.sort(entities);

而不需要编写一行排序代码。

这说明了使用接口的基本原理,即允许其他人使用您的代码,并且(对您个人更有用)允许您的代码以可靠的方式使用其他人的代码。

至于“一个用于类的每个行为方面的接口”,这听起来有点过头了,或者可能有些过头了。您希望接口有意义,因此,例如,TelephoneThatIsAlsoAToaster接口很糟糕--您应该有两个接口:TelephoneToaster。另一方面,你不应该有成群的接口PluggableVisibleHasButtonsFlammable……必要的详细程度将取决于应用程序。

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

https://stackoverflow.com/questions/10000578

复制
相关文章

相似问题

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