2016-09-12 78 views
1

是否像下面那樣在Java接口中重載方法。然後使用你的子類中所需的方法?如果沒有,有沒有更好的方法來做到這一點,好心建議。Java接口中的重載方法

interface IEmployees{ 
    public List<String> getEmployees(List<String> employees, List<String> departments); 
    public List<String> getEmployees(List<String> employees, String name); 
} 

class EmployeesByDept implements IEmployees{ 
    public List<String> getEmployees(List<String> employees, List<String> departments){ 
     // select employees belonging to depts in list and return. 
    } 
    public List<String> getEmployees(List<String> employees, String name){ 
     throw new UnsupportedOperationException(); 
    } 
} 

class EmployeesByName implements IEmployees{ 
    public List<String> getEmployees(List<String> employees, List<String> departments){ 
     throw new UnsupportedOperationException(); 
    } 
    public List<String> getEmployees(List<String> employees, String name){ 
     // select employees with name in list and return. 
    } 
} 
+0

你是什麼意思的「是對的」? – Mena

+0

如果只允許其中一種方法,我會將接口分成兩部分。除此之外,如果接口只包含一個由一個類實現的方法,您可能會問自己該接口是否需要。 – Thomas

+0

什麼是'IEmployees' *假設*代表?答案真的取決於那個。它是:1a)所有已知僱員的名單,1b)所有已知僱員的任意子集,或2)有員工的一些組織? –

回答

0

嗯,是的,不,它取決於。

在適當的情況下,一般情況下肯定會有這種情況。

就你而言,可能不是,並且很多問題歸結爲更基本的設計問題。所以,通過閱讀您的片段出現的可能性是,一個IEmployees是:

  1. 系統中的一組全體員工(例如,所有的項目或工作的公司員工),或
  2. 員工的任意列表(包括1個,而且例如搜索結果等在內的List<Employee>的語義等效,或
  3. 具有與其相關聯的員工列表(例如,A構建體,一個項目,或一個組織)

但是你說:

它實際上是一個僱員過濾器類。它將被其他過濾器類繼承,並將在接口中實現任何一種重載方法。

所以你的第一個小問題是接口名稱本身。 IEmployees在空中留下了很多,但如果您將其命名爲更具自我記錄和描述性的內容,例如IEmployeeFilter,那麼事情就會變得更加明顯。

所以,現在你有一個「過濾器」,看來你想有多個單獨的過濾策略:

  • 通過部門
  • 員工姓名
  • 可能還有其他

這些是單獨的過濾器,並且您聲明您的界面定義了過濾器,以及因此這些更合適地組織爲兩個單獨的小類

所以首先界面應該是什麼是所有過濾器共同的。過濾如何完成並不是常見的方面。過濾本身是。所以考慮:

interface IEmployeeFilter { 
    public List<String> getEmployees (List<String> employees); 
} 

現在你有一個過濾器是有道理的,一個常用的方法,以及其他一切屬於地方,例如:

class EmployeeNameFilter implements IEmployeeFilter { 

    private String name; 

    public EmployeeNameFilter (String name) { 
     this.name = name; 
    } 

    @Override 
    public List<String> getEmployees (List<String> employees) { 
     return employees filtered appropriately 
    } 

} 

和:

class EmployeeDepartmentFilter implements IEmployeeFilter { 

    private List<String> departments; 

    public EmployeeDepartmentFilter (List<String> departments) { 
     departments = new ArrayList<String>(departments); 
    } 

    @Override 
    public List<String> getEmployees (List<String> employees) { 
     return employees filtered appropriately 
    } 

} 

等,然後,當你準備使用一個界面始終是相同的:

List<String> employees = ...; 
IEmployeeFilter filter = new EmployeeNameFilter("bob"); // or... 
// IEmployeeFilter filter = new EmployeeDepartmentFilter(...); 

List<String> results = filter.getEmployees(employees); // <- interface always the same 

點是,接口作爲一種工具存在讓工作更輕鬆。當你遇到了一堆實現這個接口的類,但它們都實現了它的不同部分時,你已經開始打敗接口的目的,這是一個很好的暗示,有一個基本的變化需要在你的設計中製作。

也就是說,更一般的經驗法則可能是:如果你的界面讓你的工作更加困難,或者讓你的代碼更復雜,你做錯了什麼。否則,你已經做了正確的事情。

希望有道理。

+0

的一個好選擇。另一種選擇是界定單個員工的合格/不合格標準的界面。 'interface Filter {public boolean isAcceptable(String employee); }',在其他地方你可以通過循環一個列表並創建一個結果列表來應用它,例如, '公開列表 filterEmployees(列表員工,過濾器過濾器){...}'。 –

2

在我看來,超載接口這種方式不是一個好主意,因爲這會在實現類中產生不必要的/無用的代碼。

因此,我要推薦給寫2個或3種不同的接口,像這樣

interface IEmployees { 
} 

interface IEmployeesByDept extends IEmployees { 
    public List<String> getEmployees(List<String> employees, List<String> departments); 
} 

interface IEmployeesByName extends IEmployees { 
    public List<String> getEmployees(List<String> employees, String name); 
} 

這樣你就可以簡潔地實現您的情況相匹配的接口。

+0

這是另一個很好的策略,如果它適用於應用程序(例如派生過濾器可以按照類別分爲「按名稱」和「按部門」一般類別,每個類別有多個實施)+1,也歡迎訪問站點! –

+1

有人可能會說這裏可能不需要一個空的'IEmployees'(你會怎麼做?),並且特定接口的名稱表明可能只有一個實現,所以即使這些接口可能不是必需的,但應該是實現本身(假設沒有多個特定接口的實現)。 – Thomas

0

您的使用情況不保證使用接口的所有

的接口表示的合同。您將合同定義爲能夠滿足兩項要求。如果你知道你將無法提供合同的兩個部分,根本不使用接口。

此外,我強烈懷疑你有替代的方式得到這些員工列表的,另一個原因使用的接口。

替代解決方案

我猜你IEmployeesXXX類沒有狀態變量。這是一個很好的指示器,方法是獲取和返回對象列表的實用方法。

你應該使它成爲一個經典的工具類,即abstract final classstatic方法。

下面是使用自己的代碼示例,至極變得清潔:

public abstract final class Employeesutility{ 
    public static List<String> getEmployees(List<String> employees, List<String> departments){ 
     // select employees belonging to depts in list and return. 
    } 
    public static List<String> getEmployees(List<String> employees, String name){ 
     // select employees with name in list and return. 
    } 
} 

注前進

我不喜歡的實用工具類多少,我寧願做一箇中間階層,富人內部表示和豐富的集合,這些都暴露了您提出的接口方法。但對於你的用例,這可能意味着重複整個數據庫(猜測你有一個),這將是愚蠢的。請考慮它,如果你決定創建一個真正的僱員類......當你的程序變得足夠大時,你會這樣做。