您好我正在尝试使用Java8中提供的供应商和消费者。 我正在尝试使用构建器模式,每次我必须构建我的节/有效负载时,我可以重用代码。
所以我有一个Stanzabuilder课程,我正在通过课程T(期待任何课程)
public abstract class StanzaDataBuilder<T> {
final Supplier<T> instance;
StanzaDataBuilder(Supplier<T> instance) {
this.instance = instance;
}
public T build() {
return this.instance.get();
}
现在我正在尝试为其中一个类(RetailProfile)构建一个节 为此,我编写了一个构建器类RetailProfileBuilder并扩展了StanzaBuilder并在该设置中添加了一些值:
public class RetailProfileDataBuilder extends StanzaDataBuilder<RetailProfile>{
RetailProfileDataBuilder() {
super(RetailProfile::new);
}
public static RetailProfileDataBuilder of() {
RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();
rpf.instance.get().setDomain("RetailBuffer");
return rpf;
}
当我调试并放置system.out.println(rfb.instance.get().getDomain())
时,我可以看到该值已设置,但是当我返回此rpf时,value为null。
我可以看到我正在返回obj <b>rpf</b>
这是一个新对象,因此值设置为null。所以我尝试返回实例
return (RetailProfileDataBuilder) rpf.instance;
这里我得到一个例外:
java.lang.ClassCastException: package.RetailProfileDataBuilder$$Lambda$35/457597997 cannot be cast to package.RetailProfileDataBuilder
我将构建器类称为:
RetailProfileDataBuilder rbdb= RetailProfileDataBuilder.of().build();
在这里,我为RetailProfileDataBuilder类中设置的字段获取null值。
关于如何使用值返回rpf对象的任何想法?
感谢您的时间
答案 0 :(得分:0)
rpf.instance.get()
每次调用时都会创建一个新RetailProfile
,因此您会看到null
值,而不是您为上一个实例设置的值
如果要为Builder创建的每个实例设置一些默认值,则需要在构建器类中添加一些字段以维护状态。
public class RetailProfileDataBuilder extends StanzaDataBuilder<RetailProfile>{
String domain;
RetailProfileDataBuilder() {
super(RetailProfile::new);
}
public static RetailProfileDataBuilder of() {
RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();
domain = "RetailBuffer"; // Here you remember the `domain` value
return rpf;
}
@Override
public RetailProfile build() {
RetailProfile rp = super.build();
rp.setDomain(domain); // Here you pass the builder state to your new object
return rp;
}
}
答案 1 :(得分:0)
select t1.field1,
t1.field2,
t2.field3
from t1 t1
inner join t2 t2 on t1.xyz = t2.xyz
left join t3 t3 on t1.xyz = t3.xyz and t3.abc = 'Y'
left join t4 t4 on t1.xyz = t4.xyz and t4.abc = 'Y'
where t1.status IN ( 'S', 'W' )
and (t3.xyz is not null or t4.xyz is not null)
是rpf.instance
,而不是Supplier<RetailProfile>
,因此您无法将其投放到该类型。
如果要返回设置域的实例,可以写:
RetailProfileDataBuilder
如果您想要返回始终生成其域名已设置public static RetailProfile of() {
RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();
RetailProfile rp = rpf.instance.get();
rp.setDomain("RetailBuffer");
return rp;
}
的{{1}},则需要将另一个RetailProfileDataBuilder
传递给您的构造函数:
RetailProfile