繁体   English   中英

为什么 Retrofit 使用 Interface 而不是普通的 java 类?

[英]Why does Retrofit use Interface instead of a normal java class?

在我的 Android 中,我使用 Retrofit 来实现一个 http 客户端。
Retrofit 使用接口来定义可能的 http 操作。

用户界面.java

UserInterface.java
public interface UserInterface {
   // Retrofit callback
   @POST("login")
   Call<Integer> signin(@Body LoginActivity.UserInfo userInfo);
}

然后在 loginActivity.java 中改造使用这个 UserInterface:

登录活动.java

// It makes sense. Retrofit will use the interface as a configuration file
UserInterface userInterface = ApiClient.getApiClient().create(UserInterface.class);

客户端程序

public static Retrofit getApiClient(){
   if (retrofit==null){
       retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
               .addConverterFactory(GsonConverterFactory.create())
               .build();
   }
   return retrofit;
};

我了解有关 Retrofit Client 配置及其工作原理的一切。 但是,我不明白为什么 userInterface 是一个 java 接口而不是一个普通的 java 类?
我知道简而言之,这就是接口:

接口是 Java 中的引用类型。 它类似于类。 它是抽象方法的集合。 一个类实现了一个接口,从而继承了接口的抽象方法。 除了抽象方法,接口还可以包含常量、默认方法、静态方法和嵌套类型。 方法体仅存在于默认方法和静态方法中。

编写接口类似于编写类。 但是类描述了对象的属性和行为。 接口包含类实现的行为。

除非实现接口的类是抽象类,否则接口的所有方法都需要在类中定义。

我也理解了 Retrofit 接口的特殊作用:

您可以将接口视为配置文件,它保存有关每个端点的信息(方法声明、返回类型和参数、注释)(将方法名称链接到 url、GET 或 POST、参数和参数类型、返回值类型、.. 。 和更多)。 引擎使用这些信息来序列化参数(如果需要),执行请求并反序列化响应(如果需要)。

但是,我仍然无法向自己解释使用接口而不是普通的 java 类

如果您查看Retrofit 库的源代码,特别是Retrofit.java类的create()方法,您会发现它们正在使用Java 的动态代理方法在运行时创建类。

这种机制需要一个接口(或接口列表)来创建具有特定行为的代理类。 这解释了为什么使用接口而不是普通的 java 类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM