Можно ли автоматически создавать конструкторы на основе подчиненных интерфейсов? (с Ломбоком или без)

Используйте следующий код в качестве примера.

Можно ли автоматически сгенерировать MySuperInterfaceImpl(MyInterface myInterface, double myDouble)?

Я предпочитаю избегать lombok.Builder, потому что он может вызвать проблемы с NullPointerException.

Еще одно упоминание: использование @lombok.experimental.Delegate и @lombok.AllArgsConstructor приведет к обмену конструкторами, поэтому в этом случае я бы спросил, как сгенерировать конструктор MySuperInterfaceImpl(String myString, int myInt, long myLong, double myDouble). Честно говоря, я предпочитаю эту реализацию.

interface MyInterface {
    String getMyString();
    int getMyInt();
    long getMyLong();
}

@lombok.Value
class MyInterfaceImpl implements MyInterface {
    String myString;
    int myInt;
    long myLong;
}

interface MySuperInterface extends MyInterface {
    double getMyDouble();
}

@lombok.Value
@lombok.AllArgsConstructor
class MySuperInterfaceImpl implements MySuperInterface {
    String myString;
    int myInt;
    long myLong;
    double myDouble;

    /**
    * It would be great if I could hide/automatically generate this constructor with an annotation
    */
    MySuperInterfaceImpl(MyInterface myInterface, double myDouble) {
        this(myInterface.getMyString(), myInterface.getMyInt(), myInterface.getMyLong(), myDouble);
    }
}

@lombok.Value
@lombok.AllArgsConstructor
class MySuperInterfaceImpl2 implements MySuperInterface {
    @Delegate MyInterface myInterface;
    double myDouble;

    /**
    * It would be great if I could hide/automatically generate this constructor with an annotation
    */
    MySuperInterfaceImpl(String myString, int myInt, long myLong, double myDouble)
        this(new MyInterface() {
            String myString() { return myString; }
            int myInt() { return myInt; }
            long myLong() { return myLong; }
        }, myDouble);
    }
}

Как это означает знать, какой экземпляр MyInterface вы хотите использовать в качестве делегата?

Mr R 30.03.2021 06:14

@MrR - это именно MyInterface, а не какая-либо другая конкретная реализация, как это показано во втором конструкторе MySuperInterfaceImpl

Leobastiani 30.03.2021 16:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время нет чистого способа сделать это без использования @SuperBuilder. См. Проблему 2646

Ниже приведен самый чистый пример @SuperBuilder, не требующий явных определений конструктора.

Обратите внимание, что в моем lombok.config я также устанавливаю следующее:


lombok.equalsAndHashCode.callSuper = CALL
lombok.toString.callSuper = CALL


import lombok.Value;
import lombok.experimental.NonFinal;
import lombok.experimental.SuperBuilder;

public class So66862187 {

    
    /**
     * The Interface MyInterface.
     */
    interface MyInterface {

        /**
         * Gets the my string.
         *
         * @return the my string
         */
        String getMyString();

        /**
         * Gets the my int.
         *
         * @return the my int
         */
        int getMyInt();

        /**
         * Gets the my long.
         *
         * @return the my long
         */
        long getMyLong();
    }

    /**
     * Since we want our implementations to be final we need a common abstract super class
     */
    @Value
    @NonFinal
    @SuperBuilder(toBuilder = true)
    public static abstract class AbstractMyInterface implements MyInterface {
        
        /** The my string. */
        String myString;

        /** The my int. */
        int myInt;

        /** The my long. */
        long myLong;
    }

    /**
     * The Class MyInterfaceImpl.
     */
    @Value
    @SuperBuilder(toBuilder = true)
    public static class MyInterfaceImpl extends AbstractMyInterface {}


    /**
     * The Interface MySuperInterface.
     */
    interface MySuperInterface extends MyInterface {

        /**
         * Gets the my double.
         *
         * @return the my double
         */
        double getMyDouble();
    }

    /**
     * <p>This class is optional. If there is only going to be on implementation of {@link MySuperInterface} you don't need it.
     */
    @Value
    @NonFinal
    @SuperBuilder(toBuilder = true)
    public static abstract class AbstractMySuperInterface extends AbstractMyInterface implements MySuperInterface {

        /** The my double. */
        double myDouble;

    }

    /**
     * The Class MySuperInterfaceImpl.
     */
    @Value
    @SuperBuilder
    public static class MySuperInterfaceImpl extends AbstractMySuperInterface {}

}

Это похоже на то, что я искал, спасибо ♥

Leobastiani 31.03.2021 01:19

@Leobastiani Отлично! Не могли бы вы принять ответ?

Jeff 31.03.2021 18:46

Другие вопросы по теме