0

首先,我的无所不在的语言是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,我应该实现一个Comparable接口。但为什么?多态性?可读性?或者是其他东西?如果是 PHP——我应该Comparable为自己创建接口吗?

所以这里是第二部分。

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

interface Stringable
{
    public function __toString();
}

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

4

2 回答 2

6

如果是 Java,我应该实现一个 Comparable 接口。但为什么?

好吧,您已经提供了一种将“this”与另一个实例进行比较的方法......如果您实现Comparable了,您就是在告诉系统的其余部分您支持该功能,以便比较可以用于排序、查找“最大”或“最小”值等......都在对您的类型一无所知的例程中。

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

这对我来说听起来有些过分。(您的示例不是一个好示例,因为已经存在toString()Object)不要无缘无故地随机创建接口 - 但如果您希望该行为由不需要了解您的具体类型的代码使用,请创建它们,仅关于它支持什么。可测试性就是一个很好的例子——如果你编写了一个“身份验证器”类,那么你可以想象在你的生产代码交换不同的身份验证器,或者在测试其他使用身份验证的组件时模拟/伪造身份验证器。

于 2012-04-03T20:11:00.977 回答
2

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

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

Collections.sort(entities);

无需编写一行排序代码。

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

至于“类的每个行为方面的接口”,这听起来像是矫枉过正,或者可能是矫枉过正。您希望接口有意义,因此,例如,TelephoneThatIsAlsoAToaster接口不好——您应该有两个接口:TelephoneToaster. 另一方面,您不应该拥有大量的接口、、、Pluggable...VisibleHasButtonsFlammable必要的详细程度将取决于应用程序。

于 2012-04-03T20:31:57.570 回答