我刚刚开始学习和实现构建器模式 Wiki 。还有Effective Java 的CH2。
这与 JSP servlet 相关,这可能有点复杂,但我只是想将其传递给你们,看看如何正确地做到这一点。
让我们从一个场景开始,您无法完全构建对象,并且未给出某些信息。因此,很可能您必须将对象放入 session 中,然后稍后将变量添加到 session 对象中。我如何使用构建模式来实现这一点?
这是一个代码示例
public class Widget(){
public static class Builder(){
public Builder(String id) {...}
public Builder serialNumber (String val) {...}
public Builder area (String val) {...}
public Widget build() { return new Widget(this); }
}
private Widget(Builder builder){...}
}
JSP Servlet 1//只有ID信息
Widget w = new Widget().Builder(id).build();
HttpSession session = request.getSession();
session.setAttribute("widget", w);
JSP Servlet 2//现在我有了序列和区域
Widget.Builder w = (Widget.Builder) session.getAttribute("widget");
//** This is as far as I go **
w.serialNumber("something") // Now this works
.area("sideArea") //
.build() // < I know if I do this I will be creating another Object. Is there a way to use build pattern without creating redundant obj?
谢谢大家...
最佳答案
w.serialNumber("something") // Can not find symbol
因为serialNumber不是w对象的方法。您可能正在寻找的是 method chaining :
public class Widget {
... //assuming you have all the right fields here
public Widget setSerialNumber(String id) {
this.id = id;
return this;
}
public Widget setArea(String area) {
this.area = area;
return this;
}
public static class Builder(){
public Builder(String id) {...}
public Builder serialNumber (String val) {...}
public Builder area (String val) {...}
public Widget build() { return new Widget(this); }
}
private Widget(Builder builder){...}
}
那么你可以这样做:
w.setSerialNumber(id).setArea(area);
当您想要构造新的 Widget 对象时,请使用 Widget.Builder;当您想要更改现有的 Widget 对象时,请使用方法链。
关于Java Builder 模式传递给 session JSP servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23146323/