Используйте следующий код в качестве примера.
Можно ли автоматически сгенерировать 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);
}
}
@MrR - это именно MyInterface, а не какая-либо другая конкретная реализация, как это показано во втором конструкторе MySuperInterfaceImpl




В настоящее время нет чистого способа сделать это без использования @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 Отлично! Не могли бы вы принять ответ?
Как это означает знать, какой экземпляр MyInterface вы хотите использовать в качестве делегата?