其思想是在.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"
}
1条答案
按热度按时间mwngjboj1#
没有更简单的方法可以直接实现这一点,但是,这种设计是可疑的。假设有一个单独的字段,现在可能会有“无效”状态-字段不一致。例如,其中
summary
只包含“Hello world”,而不是您实际希望它包含的内容。一个更好的解决方案是根本不使用字段,而只编写一个getter:
或者,如果这个类的设计(你的问题在这个主题上不清楚)是这样的,你 * 可以 * 添加一个摘要,但如果你不这样做,你得到的是标题+作者+描述,仍然,编写getter,只是,略有不同的采取:使用
null
或""
作为标记:Lombok确实有
@Builder.Default
机制,但是这个机制不能用来引用在构建过程中设置的任何东西(也就是说,你可以设置为默认的'Hello world',或者甚至是"" + System.currentTimeMillis()
,任何java表达式都可以,但是你不能引用标题,作者,或由调用者为构建器设置的描述,因此您不能使用它来将summary
字段“默认”为您想要的值。