如何使用带有扩展字段的Lombok创建实例



我有下一个问题。我有这个方法:

public void sendDeletedEvent(final Comment comment) {
log.info("SendDeletedEvent.E with Comment: {}", comment);
final CommentDTO commentDTO = commentMapper.toDTO(comment);
final CommentDeleteEvent commentDeleteEvent =  new CommentDeleteEvent(commentDTO);
kafkaTemplate.send(commentEventTopic, commentDeleteEvent);
log.info("SendDeleteEvent.X with CommentDeleteEvent : {}", commentDeleteEvent);
}

,我想替换lombok构建器上的所有新创建,但是我有一些问题。这是我的CommentDeleteEvent类:

@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@NoArgsConstructor
@Builder
@Data
public class CommentDeleteEvent extends AbstractCommentEvent {
public CommentDeleteEvent(CommentDTO comment) {
super(DELETE, comment);
}
}

和abstractEvent

@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public abstract class AbstractCommentEvent extends AbstractEvent {
private CommentDTO comment;
public AbstractCommentEvent(EventType eventType, CommentDTO comment) {
super(eventType);
this.comment = comment;
}
}

所以当我尝试构建,构建器没有看到抽象的CommentDTO字段,我应该怎么做?我可以做下一个代码,但我认为这是个坏主意:

log.info("SendDeletedEvent.E with Comment: {}", comment);
final CommentDTO commentDTO = commentMapper.toDTO(comment);
final CommentDeleteEvent commentDeleteEvent = (CommentDeleteEvent) AbstractCommentEvent.builder()
                         .comment(commentDTO)
                         .build();
kafkaTemplate.send(commentEventTopic, commentDeleteEvent);
log.info("SendDeleteEvent.X with CommentDeleteEvent : {}", commentDeleteEvent);

我应该做什么,或者我的想法不是最糟糕的?

您想使用的是@SuperBuilder而不是@Builder@SuperBuilder与超类的字段一起工作。这个注释应该同时添加到父类和子类中。

同样,由于显而易见的原因,我们不能在抽象超类上调用builder。构建器无法知道要实例化哪个子类。这不是Lombok的限制,这就是OOP的工作方式。

因此,我们应该按如下方式调用构建器:

final CommentDeleteEvent commentDeleteEvent = CommentDeleteEvent.builder()
.comment(commentDTO)                                                                                      
.build();

最新更新