首先,我的通用语言是 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
接口(interface)。但为什么?多态性?可读性?或者是其他东西?如果是 PHP,我应该为自己创建 Comparable 接口(interface)吗?
接下来是第二部分。
我的同事告诉我,Java 中的一条经验法则是为类的每个行为方面创建一个接口(interface)。例如,如果我想将此对象呈现为字符串,我应该通过诸如 implements Stringable
之类的方式来声明此行为,在 PHP 的情况下,Stringable
看起来像:
interface Stringable
{
public function __toString();
}
这真的是经验法则吗?这种方法有什么好处? PHP 值得吗?那么在 Java 中呢?
最佳答案
If it would have been Java, I should have implemented a Comparable interface. But why?
好吧,你已经提供了一种将“this”与另一个实例进行比较的方法...如果你实现了Comparable,你就告诉系统的其余部分你支持这种能力,这样比较就可以用于排序、查找“最大值”或“最小值”等...所有这些都在对您的类型一无所知的例程中。
My colleague told me that it is a rule of thumb in Java to create an interface for every behavioral aspect of the class.
这对我来说听起来有些过分了。 (你的例子不是一个好的例子,因为 Object
上已经有 toString()
了。)不要无目的地随机创建接口(interface) - 但如果你想要的话就创建它们代码使用的行为不需要了解您的具体类型,只需要了解它支持的类型。一个很好的例子是可测试性 - 如果您编写一个“身份 validator ”类,那么您可以想象在生产代码中交换不同的身份 validator 或在以下情况下模拟/伪造身份 validator 您正在测试使用身份验证的其他组件。
关于java - 接口(interface) : profit of using,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000578/