Java + Lombok -在.build()时填充字段

ctehm74n  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(122)

其思想是在.build()时间填充summary

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class Book
{
    protected String title;
    protected String author;
    protected String description;
}
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class BookSummary extends Book
{
    public String summary;

    public BookSummary(BookSummaryBuilder<?, ?> b)
    {
       super(b);
       this.summary = getTitle() + getAuthor() + getDescription();
    }  
}

一切正常,但我想知道是否有一种更简单/更优雅的方法来完成同样的工作,而无需创建此构造函数

    • 更新**

我不能简单地覆盖summary get方法,因为一些将此对象作为参数接收的API不使用访问器从字段中检索值。
例如:

public class BookSummary extends Book
{
    @Builder.Default
    public String summary = "xxxxxxxxxxxxxxx";

    public String getSummary()
    {
        return getTitle() + getAuthor() + getDescription();
    }
}

BookSummary bookSummary = BookSummary.builder()
            .title("Java forever")
            .author("John John")
            .description("bla-bla-bla-bla")
            .build();

String json = new GsonBuilder().create().toJson(bookSummary)

Json:

{
    "summary":"xxxxxxxxxxxxxxx",
    "title":"Java forever",
    "author":"John John",
    "description":"bla-bla-bla-bla"
}
mwngjboj

mwngjboj1#

没有更简单的方法可以直接实现这一点,但是,这种设计是可疑的。假设有一个单独的字段,现在可能会有“无效”状态-字段不一致。例如,其中summary只包含“Hello world”,而不是您实际希望它包含的内容。
一个更好的解决方案是根本不使用字段,而只编写一个getter:

public String getSummary() {
  return getTitle() + " " + getAuthor() + " " + getDescription();
}

或者,如果这个类的设计(你的问题在这个主题上不清楚)是这样的,你 * 可以 * 添加一个摘要,但如果你不这样做,你得到的是标题+作者+描述,仍然,编写getter,只是,略有不同的采取:使用null""作为标记:

public String getSummary() {
  return summary != null ? summary :
    (getTitle() + " " + getAuthor() + " " getDescription());
}

Lombok确实有@Builder.Default机制,但是这个机制不能用来引用在构建过程中设置的任何东西(也就是说,你可以设置为默认的'Hello world',或者甚至是"" + System.currentTimeMillis(),任何java表达式都可以,但是你不能引用标题,作者,或由调用者为构建器设置的描述,因此您不能使用它来将summary字段“默认”为您想要的值。

相关问题