Почему Retrofit использует интерфейс вместо обычного java класса? - PullRequest
0 голосов
/ 15 января 2020

В моем Android я использую Retrofit для реализации http-клиента.
Retrofit использует интерфейсы для определения возможных операций http.

userInterface. java

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

Этот пользовательский интерфейс затем используется для модификации в loginActivity. java:

loginActivity. java

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

ApiClient. java

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 класса?
Я знаю, что в двух словах это интерфейс:

An интерфейс является ссылочным типом в Java. Это похоже на класс. Это коллекция абстрактных методов. Класс реализует интерфейс, тем самым наследуя абстрактные методы интерфейса. Наряду с абстрактными методами интерфейс может также содержать константы, методы по умолчанию, методы stati c и вложенные типы. Тела метода существуют только для методов по умолчанию и методов stati c.

Написание интерфейса похоже на написание класса. Но класс описывает атрибуты и поведение объекта. И интерфейс содержит поведения, которые реализует класс.

Если класс, реализующий интерфейс, не является абстрактным, все методы интерфейса должны быть определены в классе.

Я также понял особую роль интерфейса с Модификация:

Вы можете видеть интерфейс в виде файла конфигурации, он содержит информацию (объявление метода, тип возвращаемого значения и параметры, аннотации) о каждой конечной точке (связать имя метода с URL, GET или POST, параметры и типы параметров, тип возвращаемого значения, ... и многое другое). механизм использует эту информацию для сериализации параметров (при необходимости), выполнения запроса и десериализации ответа (при необходимости).

Однако я все еще не могу объяснить себе использование интерфейса вместо обычного java класса ?

1 Ответ

1 голос
/ 16 января 2020

Если вы посмотрите на исходный код библиотеки Retrofit , в частности метод create() класса Retrofit.java, вы увидите, что они используют Java Dynami c Proxy подходит для создания классов во время выполнения.

Этот механизм требует интерфейса (или списка интерфейсов) для создания прокси-классов с определенным поведением. Это объясняет, почему используется интерфейс вместо обычного java класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...