2012-04-03 40 views
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接口。但为什么?多态性? Readbility?或者是其他东西?如果是PHP - 我应该为自己创建Comparable界面吗?

所以这里是第二部分。

我的同事告诉我,为Java的每个行为方面创建一个接口是Java中的一条经验法则。例如,如果我想提出这个对象的字符串,我应该是:由类似implements Stringable,凡在PHP Stringable的情况是这样的行为:

interface Stringable 
{ 
    public function __toString(); 
} 

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

+1

我认为这个问题似乎更适合programmers.stackexchange.com – 2012-04-03 20:10:04

回答

6

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

嗯,你已经提供了比较的方法“这个”与另一个实例......如果实现Comparable,你告诉系统你支持能力的休息,因此比较可以用于排序,找到“最大”或“最小”值等......所有这些都不知道您的类型。

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

这听起来有点过火给我。 (你的例子不是很好,因为Object已经有toString()。)不要随意创建接口 - 但是如果你希望代码使用这个行为,而不需要知道你的具体类型,只关于它支持的内容。一个很好的例子就是可测试性 - 如果你写一个“认证者”类,那么你可以想象在你测试其他使用认证的组件时交换产品代码中的不同认证码。实施Comparable

2

一个非常实际的原因是不喜欢

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

Collections.sort(entities); 

东西无需编写代码排序的单行的能力。

其中提到要使用的接口,它允许其他人使用你的代码和(更有效地对你个人),使你的代码以可靠的方式使用别人的代码的基本理念。

至于“一个界面行为方面的类”,这听起来像是矫枉过正,或者像它可能是矫枉过正。你想接口是有道理的,所以,例如,TelephoneThatIsAlsoAToaster接口是坏的 - 你应该有两个接口:TelephoneToaster。在另一方面,你不应该有接口PluggableVisibleHasButtonsFlammable群......等 细节的必要水平将取决于应用。

+0

嗯,所以从这个角度来看没有什么做用PHP接口。 – zapadlo 2012-04-03 20:35:27

+0

@Zapadlo怎么会这样? – trutheality 2012-04-03 20:42:40