Рубрики
Без рубрики

Почему Интерфейсы Java Ужасны

Еще одна причина, по которой я предпочитаю Идти. Помеченный java, иди.

Так что, может быть, они и не ужасны, но они определенно ведут себя не так, как я надеялся, будучи новичком в Java, которым я являюсь.

Моя проблема возникла, когда я пытался создать модульный тестируемый фрагмент кода для лямбда-функции AWS, которая взаимодействует с DynamoDB. Что я сделал, так это создал класс База данных в которой был конструктор, который выглядел так:

public class Database {
    public DynamoImpl db;

    // code removed for simplicity

    public Database(DynamoImpl db) {
        this.db = db;
    }
}

Dynamo Impl – это интерфейс, который выглядит следующим образом:

public interface DynamoImpl {
  public PutItemResult putItem(PutItemRequest putItemRequest);

  public GetItemResult getItem(GetItemRequest getItemRequest);
}

Эти два метода являются частью большого интерфейса Amazon DynamoDB , который можно использовать для связи с вашей таблицей DynamoDB. Моя цель с этим дизайном состояла в том, чтобы сделать его таким, чтобы я мог 1) пройти в производстве Amazon DynamoDB из моей лямбда-функции (которая вызывает методы в базе данных ) или 2) передать тестовую реализацию DynamoImpl интерфейс для демонстрации его в модульных тестах. Это позволило бы сократить необходимость реализации всего интерфейса 60 method-log Amazon DynamoDB и просто упростить жизнь.

Не может быть сделано .

Когда я пытаюсь пройти в Amazon DynamoDB , он отклоняется.

База данных конструктора (Amazon DynamoDB) не определена

Кроме того, приведение Amazon DynamoDB как Dynamo Impl перед передачей его в конструктор, похоже, работает изначально, но терпит неудачу при фактическом вызове кода.

Для меня это очень странно но я действительно родом оттуда, где такие вещи прямолинейны. Такое ощущение, что он обрабатывает интерфейс как строгий тип, и если вы хотите передать его в качестве аргумента, вы можете только реализовать методы, которые он определяет, и ничего больше. Таким образом, вместо того, чтобы иметь возможность передавать уменьшенный интерфейс, он будет использовать только большой. Мне это кажется такой странной вещью… но опять же, я исхожу из другой языковой точки зрения.

Так заканчивается моя напыщенная речь.

РЕДАКТИРОВАТЬ : Вот отличный ответ Бертиля Мута, обсуждающего возможное решение моего сценария. Это стоит того, чтобы прочесть.

Оригинал: “https://dev.to/forstmeier/why-java-interfaces-are-terrible-1abp”