2017-09-25 99 views
0

我有一個接口接口隔離原則 - Java的

interface XXXCommandHandler(){ 
    void parse(String something); 
    String response(); 
    String additionalResponse(); 
} 
  1. 一些實現XXXCommandHandler的類不實現additionalResponse()。
  2. 我使用ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)得到實現XXXCommandHandler
  3. 類然後調用分析,應對和additionalResponse
  4. 由於某些不實現additionalResponse我不得不返回null 。

我能想到的以下

  1. ,而不是返回空的類沒有實現additionalResponse,declaire additionalResponse作爲默認的方法和返回null /或使其返回可選等,並覆蓋它的在實現additionalResponse方法的類上。
  2. 醜陋的方式: - 在所有類別中返回NULL沒有實現additionalResponse
  3. 與解析和應對方法和XXXCommandHandlerAddtionalresponse()與additionalResponse方法延長XXXCommandHandlerParser即

    接口XXXCommandHandlerParser創建兩個不同的接口XXXCommandHandlerParser() (){

    void parse(String something); 
        String response(); 
    
    } 
    

    接口XXXCommandHandlerAddtionalresponse() 延伸XXXCommandHandlerParser {

    String additionalResponse(); 
    } 
    
  4. 但如果我這樣做#3,我不得不改變 ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandlerAddtionalresponse.class)。

  5. 如果我做#4,那麼沒有實現additionalResponse或沒有實現XXXCommandHandlerAddtionalresponse的類將不會被拾取。

你能想到任何優雅的方式嗎?

+0

@Mena - 我覺得你的意思是#1在接口默認方法中可選。 –

+0

「我有一個接口'接口XXXCommandHandler(){...'」 ......這不是有效的Java。 –

+0

Hari,您仍然需要正確格式化代碼以獲得更好的可讀性 –

回答

0

它的味道哪種解決方案更優雅的事,但有(至少)一個更路要走:

  1. 創建一個頂層接口:了InterfaceA

  2. 擴展了InterfaceA到interfaceB與額外的方法。

  3. 收藏型了InterfaceA

  4. 的豆如果實例interfaceB高於鑄態,並調用額外的方法。

也許它沒有比默認實現返回一個可選項更優雅。

0

根據「additionalResponse」是什麼,它可以在基接口中聲明它,向基礎實現添加一個返回null(或一個空字符串?)的實現,並將實際實現添加到相應的子類中。

在現實世界中的問題,它通常有助於思考是否另一個開發者可能會爲你計劃,並可能爲此使用它,導致錯誤的方式實現感到驚訝。

如果你想要去幻想,在Decorator Pattern可能成爲候選人。

而子類是經格局大師通常皺起了眉頭,因爲它是用來往往比合理的,這件事情的人認識和期待。這將是@Zsolt V推薦的解決方案(這裏是僞代碼 - 可能不會編譯):

Collection<XXXCommandHandler> baseHandlers = ApplicationContextManager.getInstance() 
    .getBeansOfType(XXXCommandHandler.class).values(); 
for (XXXCommandHandler baseHandler: basehHandlers) { 
    baseHandler.parse(something); 
    baseHandler.response(); 

    if (baseHandler instanceof XXXCommandHandlerAddtionalresponse.class) { 
    XXXCommandHandlerAddtionalresponse additionalResponseHandler 
     = (XXXCommandHandlerAddtionalresponse) baseHandler: 
    additionalResponseHandler.additionalResponse(); 
    } 
} 
0

我也會盡力幫助你。從我的角度來看,您可以創建一個接口或直接的類響應,並返回它而不是字符串。在那裏你可以添加方法supportsAdditionalResponse並在獲得additionalResponse之前檢查它。如果不支持additionalResponse,則引發getAdditionalResponse方法UnsupportedOperationException。

從我的角度來看,ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)也不是一件好事,因爲您正在公開您的基礎結構。如果可能,更好的方法是添加方法List getCommandHandlers()。

public interface Response { 
    String getResponse(); 

    default Boolean supportsAdditionalResponse() { 
     return false; 
    }; 

    default String getAdditionalResponse() { 
     throw new UnsupportedOperationException(); 
    } 
    } 


    public class HttpResponse implements Response { 
    private String response; 

    public HttpResponse(String response) { 
     this.response = response; 
    } 

    @Override 
    public String getResponse() { 
     return response; 
    } 

    } 

    public interface CommandHandler { 
    void parse(String command); 
    Response getResponse(); 
    } 

    public class HttpCommandHandler implements CommandHandler { 
    private final Response response; 

    public HttpCommandHandler(Response response) { 
    this.response = response; 
    } 

    @Override 
    public void parse(String command) { 
    //do smth 
    } 

    @Override 
    public Response getResponse() { 
     return response; 
    } 
}