Lombok 中的自定义 setter 和带有静态助手的构造函数
Custom setter and constructor with static helper in Lombok
我想在 Lombok 中使用自定义 setter 和带有静态助手的构造函数:
@SuperBuilder(toBuilder = true)
public class Teacher extends User {
}
@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(NON_NULL)
public class User implements Employee {
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
private String username;
private String password;
User(String username, String password) {
System.out.println("*** test ***");
}
}
但是当我创建一个 Teacher 对象时,似乎没有调用构造函数,因为我没有在控制台中看到测试消息
Teacher.builder()
.username("username").password("pwd").build();
Builder 模式的要点几乎总是 return 从本质上可变的构建器对象到不可变对象。您所指的静态助手是用于创建 User 对象的 Builder 模式工厂方法。您不需要为 User 创建 setter,而是不应该使用 @Data 定义 User。
如果您需要在构造 User 或 Employee 对象后调用某些方法,只需将一个函数添加到相应的 class 并在构造后调用它。除了初始化 class 成员之外,隐藏构造函数内部的工作可能很危险,因为您隐藏了功能,并且如果它是私有方法,则该功能无法被覆盖。
@SuperBuilder(toBuilder = true)
public static class Teacher extends User {
}
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
public static class User implements Employee {
private final String username;
private final String password;
}
public static void main(String[] args) {
Teacher teacher = Teacher.builder()
.username("username").password("pwd").build();
System.out.println(teacher.toString());
}
interface Employee {
}
我想在 Lombok 中使用自定义 setter 和带有静态助手的构造函数:
@SuperBuilder(toBuilder = true)
public class Teacher extends User {
}
@Data
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(NON_NULL)
public class User implements Employee {
private static final PasswordEncoder ENCODER = new BCryptPasswordEncoder();
private String username;
private String password;
User(String username, String password) {
System.out.println("*** test ***");
}
}
但是当我创建一个 Teacher 对象时,似乎没有调用构造函数,因为我没有在控制台中看到测试消息
Teacher.builder()
.username("username").password("pwd").build();
Builder 模式的要点几乎总是 return 从本质上可变的构建器对象到不可变对象。您所指的静态助手是用于创建 User 对象的 Builder 模式工厂方法。您不需要为 User 创建 setter,而是不应该使用 @Data 定义 User。
如果您需要在构造 User 或 Employee 对象后调用某些方法,只需将一个函数添加到相应的 class 并在构造后调用它。除了初始化 class 成员之外,隐藏构造函数内部的工作可能很危险,因为您隐藏了功能,并且如果它是私有方法,则该功能无法被覆盖。
@SuperBuilder(toBuilder = true)
public static class Teacher extends User {
}
@AllArgsConstructor
@SuperBuilder(toBuilder = true)
public static class User implements Employee {
private final String username;
private final String password;
}
public static void main(String[] args) {
Teacher teacher = Teacher.builder()
.username("username").password("pwd").build();
System.out.println(teacher.toString());
}
interface Employee {
}