Java 接口:使用的好处
首先,我的通用语言是PHP,我正在考虑学习Java 让我把问题分为两个密切相关的部分 这是第一部分 假设我有一个域模型类。它有一些getter、setter、一些查询方法等,有一天我想比较一下它们。所以它看起来像: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)
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中的接口无关。