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