Java 接口:使用的好处

Java 接口:使用的好处,java,php,interface,Java,Php,Interface,首先,我的通用语言是PHP,我正在考虑学习Java 让我把问题分为两个密切相关的部分 这是第一部分 假设我有一个域模型类。它有一些getter、setter、一些查询方法等,有一天我想比较一下它们。所以它看起来像: class MyEntity extends AbstractEntity { public function getId() { // get id property } public function setId($id)

首先,我的通用语言是PHP,我正在考虑学习Java

让我把问题分为两个密切相关的部分

这是第一部分

假设我有一个域模型类。它有一些getter、setter、一些查询方法等,有一天我想比较一下它们。所以它看起来像:

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,我应该实现一个类似的接口。但是为什么呢?多态性?可读性?还是别的什么?如果是PHP,我应该为自己创建类似的接口吗

接下来是第二部分

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

interface Stringable
{
    public function __toString();
}
这真的是经验法则吗?这种方法有什么好处?在PHP中值得吗?用Java呢

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

好吧,你已经提供了一种方法来比较这个和另一个例子。。。如果您实现了Comparable,您会告诉系统的其他部分您支持该功能,这样比较就可以用于排序、查找最大值或最小值等。。。都是些对你的类型一无所知的例行公事

我的同事告诉我,在Java中,为类的每个行为方面创建接口是一条经验法则


对我来说,这听起来有点过分了。您的示例不是一个好的示例,因为对象上已经有toString。不要毫无目的地随机创建接口——但如果您希望代码使用这种行为,而代码不需要知道您的具体类型,只需要知道它支持什么,就可以创建它们。一个很好的例子是可测试性-如果您编写一个验证器类,然后,您可以想象在您的生产代码中交换不同的验证器,或者在测试其他使用身份验证的组件时模拟/伪造验证器。

实现Comparable的一个非常实际的原因是能够执行以下操作

List<MyEntity> entities = // ( initialize and populate )

Collections.sort(entities);
没有写一行排序代码

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

对于类的每个行为方面的接口来说,这听起来像是过度杀戮,或者可能是过度杀戮。您希望接口有意义,因此,例如,一个同样是SoatOaster接口的电话是不好的-您应该有两个接口:电话和Toaster。另一方面,你不应该有大量可插拔的、可见的、有按钮的、易燃的接口。。。等
必要的详细程度将取决于应用程序。

我认为这个问题似乎更适合程序员。stackexchange.comHmm,因此从这个角度来看,与PHP中的接口无关。