2012-04-03 33 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