2014-04-18 1 views
0

Je viens de commencer à apprendre et à implémenter des modèles de générateur à partir de Wiki. Et aussi CH2 de Java efficace. Cela concerne les servlets JSP, cela peut être un peu compliqué, mais je voulais juste le faire passer par vous pour voir comment le faire correctement. Commençons par un scénario, où vous ne pouvez pas construire complètement l'objet, il y a certaines informations qui ne sont pas données. Il est donc très probable que vous deviez mettre l'objet en session, puis ajouter des variables à l'objet de session plus tard. Comment est-ce que j'accomplirais ceci avec le modèle de construction?Java Builder Pattern passe à la session Servlet JSP

Voici un exemple de code

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 // ne disposer d'informations d'identification

Widget w = new Widget().Builder(id).build(); 

HttpSession session = request.getSession(); 
session.setAttribute("widget", w); 

JSP Servlet 2 // Maintenant, j'ai série et la zone

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? 

Merci à tous ...

+1

Pourquoi ne pas garder l'ID en session jusqu'à ce que vous soyez prêt à construire le widget entier? – GriffeyDog

+0

@GriffeyDog Oui ... Je pense que je pourrais faire ça aussi ... merci !! son nettoyeur haha. Mais je voulais savoir s'il y avait un moyen de le faire ... –

Répondre

1
w.serialNumber("something") // Can not find symbol 

car serialNumber n'est pas une méthode de l'objet w. Qu'est-ce que vous cherchez probablement est 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){...} 
} 

alors vous pouvez faire quelque chose comme ceci:

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

Utilisez Widget.Builder lorsque vous souhaitez construire un nouvel objet Widget et de méthodes enchaînées lorsque vous voulez changer un objet Widget existant.

+0

Merci d'avoir répondu à la question si rapidement. Merci d'avoir signalé mon erreur. J'ai édité mon code, maintenant je suis capable d'invoquer la classe interne Builder. Je me réfère en fait au modèle de constructeur peut-être que ma référence n'est pas bonne. [Builder- Pattern] (http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern) Donc, si j'ai besoin d'ajouter une valeur supplémentaire à Widget obj via 2nd servlet, cela créera-t-il des redondances Widget obj? –

+0

Si vous utilisez les nouvelles méthodes que j'ai ajoutées à la classe (setArea et setSerialNumber), alors non - cela ne créera pas de nouvelles instances de l'objet Widget. Chacune de ces méthodes retourne l'objet en cours de modification - la valeur this. – pawelb

+0

Je vois, c'est logique. Je suppose que c'est le seul moyen ... merci beaucoup .. –