2017-05-07 129 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。这不太重要,但仍然是将该接口重构为类的有效原因。

相关问题