Так что, может быть, они и не ужасны, но они определенно ведут себя не так, как я надеялся, будучи новичком в 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”