我正在做一個專案,我必須實作一個類層次結構。例如,典型的人員層次結構。
我有一個抽象超類Person及其子類Student。
超類人:
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(
name = "persons"
uniqueConstraints = {
@UniqueConstraint(name = "persons_name_unique", columnNames = "name")
})
public abstract class Person extends AbstractPersistable<Long>{
@Getter
private String name;
@Getter
private int age;
// ...
}
子班學生:
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "students")
public class Student extends Person {
@Getter
private int grade;
// ...
}
問題:
我的問題是當我使用.builder().
Student student =
Student.builder()
.name("UniqueName") //CompilerError(Cannot resolve method 'name' in 'StudentBuilder')
.age(19)
.grade(2)
.build();
但是,當我@Builder從超類中洗掉時,Person我只能訪問超類的屬性而不能訪問子類的屬性。當我@Builder從子類中移除并將其保留在超類中時,情況正好相反。
我的問題是我做錯了什么 - 我相信這是因為@Builder注釋,什么是正確的表示@Builder
提前致謝!
uj5u.com熱心網友回復:
你有兩個選擇。創建呼叫父建構式的構建器建構式,例如:
@Builder
public Student(String name, int age, int grade) {
super(name, age);
this.grade = grade;
}
在您的學生中(并洗掉班級@Builder)。您還需要Person @AllArgsConstructor至少將可見性擴展到受保護。看到這個。
另一種選擇是使用 Lombok @SuperBuilder(包實驗性但似乎有效)。只需@Builder用@SuperBuilder.
uj5u.com熱心網友回復:
注釋父類和子類@SuperBuilder應該是使所有屬性可用的一種方法:
- https://projectlombok.org/features/experimental/SuperBuilder
- Lombok @builder 在擴展另一個類的類上
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/382063.html
