2017-05-07 74 views
1

我在類ForumService中有一個接口ForumApi。我在這裏使用Retrofit和Rxjava。通常對於Retrofit,我們實現了一個接口,但是在下面的代碼中,我看到了class內部的接口。有什麼特別的原因嗎?爲什麼我們需要在類內聲明一個接口?我們這樣做有什麼優勢嗎?

public class ForumService { 

    public interface ForumApi { 

     @GET("/posts") 
     public Observable<List<Post>> 
      getPosts(); 

     @GET("/posts/{id}") 
     public Observable<Post> 
      getPost(@Path("id") int postId); 

     @GET("/comments") 
     public Observable<List<Comment>> 
      getComments(@Query("postId") int postId); 

     @POST("/posts") 
     public Observable<Post> 
      postPost(Post post); 
    } 
} 

回答

3

如果接口A旨在由一個特定的類/接口B使用則是有意義的通過聲明A內部B一起配合他們。

另一個例子是在Map接口內聲明的接口Map.Entry(例如,您不應該在List內使用Map.Entry)。

+0

我必須在這裏不同意。如果接口'A'旨在被特定類'B'使用,但與網絡相關的'A'和'B'包含業務邏輯,那麼它們絕對不應該在同一個文件中聲明。我甚至會說不在同一個包裏。 – Vasiliy

+0

@Vasiliy感謝您進一步採取措施,但我無法想象您描述的用例。一個例子,將不勝感激! – alfasin

+0

我不確定「用例」是什麼意思。恕我直言,任何將商業規則和網絡相關規則結合起來的類違反單一責任原則,應該重構。優選分成不同的包裝。 – Vasiliy

0

恕我直言,這是一個非最佳的設計決定。

內部接口有一些有效的用例。例如:在Observable設計模式的實現中,如果Observer和Observable之間存在一對一的對應關係,將Observer的接口(listener)聲明爲Observable內部的接口是一種普遍的做法。

這不是你的代碼中的情況。

我不知道ForumService是做什麼的,但我猜想它包含了一些與論壇管理相關的業務邏輯。如果是這種情況,那麼根據單一職責原則,ForumServiceForumApi不應該在同一個類中聲明。

我還會說,不應該將它們定義在同一個包中。所有網絡相關的類應該駐留在一個單獨的包中,其中只包含網絡連接。

此外,在這種情況下,接口本身包含實現細節 - Retrofit的註釋。通過將此接口置於ForumService內部,該設計有效地使ForumService依賴於Retrofit。這不太重要,但仍然是將該接口重構爲類的有效原因。