2014-04-18 26 views
0

我剛開始學習和實現Wiki的生成器模式。還有Effective Java的CH2。Java生成器模式傳遞到會話JSP servlet

這與JSP servlet有關,這可能有點複雜,但我只是想通過這個通過你們看到如何正確地做到這一點。

讓我們從一個場景開始,在那裏你不能完全建立這個對象,有一些沒有給出的信息。所以很有可能你必須將對象放入會話中,然後再將變量添加到會話對象中。我將如何使用Build模式來完成此任務?

下面是一個代碼示例

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? 

謝謝大家...

+1

爲什麼不直接在會話中保持ID,直到您準備好構建整個小部件? – GriffeyDog

+0

@GriffeyDog是的......我想我可以做到這一點....謝謝!它的清潔哈哈。但我想知道是否有辦法做到這一點...... –

回答

1
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){...} 
} 

那麼你可以做這樣的事情:當你想建立一個新的Widget對象

w.setSerialNumber(id).setArea(area); 

使用Widget.Builder和方法鏈接時您想要更改現有的Widget對象。

+0

謝謝你這麼快就回到這個問題。謝謝你指出我的錯誤。我編輯了我的代碼,現在我可以調用內部的Builder類。我實際上是指建造者模式,也許我的參考不好。 [Builder- Pattern](http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern)所以,如果我需要通過第二個servlet向Widget obj添加附加值,這將創建冗餘小工具obj? –

+0

如果您使用我已添加到類中的新方法(setArea和setSerialNumber),則不會 - 它不會創建Widget對象的新實例。這些方法中的每一個都會返回正在修改的對象 - 此值。 – pawelb

+0

我明白了,有道理。我想這是唯一的方法...非常感謝你.. –