2013-03-28 18 views
8

Ich habe eine (Java) -Klasse mit vielen Instanzfeldern (von denen viele optional sind). Ich möchte, dass alle Felder (also die Klasse) unveränderlich sind. Also möchte ich das Builder-Muster zum Konstruieren von Instanzen der Klasse verwenden.Kann ich myBatis so konfigurieren, dass mithilfe des Builder-Musters eine Instanz einer Klasse erstellt wird?

Kann ich myBatis konfigurieren, um eine Instanz einer Klasse mit dem Builder-Muster zu erstellen? Ich weiß, dass ich myBatis eine Karte zurückgeben und diese Karte verwenden könnte, um die Instanz in meinem Code zu erstellen. Ich bin jedoch auf der Suche nach einer Möglichkeit, diese Zuordnung zu konfigurieren (oder eine Konvention zu verwenden), ähnlich wie eine Instanz über die Verwendung von Java Beans und Konstruktoren erstellt werden kann.

Edit (enthalten ein Beispiel)

Hier ist ein Beispiel:

package com.example.model; 

// domain model class with builder 
public final class CarFacts { 

private final double price; 
private final double numDoors; 
private final String make; 
private final String model; 
private final String previousOwner; 
private final String description; 

public static class Builder { 
// required params 
private final double price; 
private final String make; 
private final String model; 

// optional params 
private final String previousOwner; 
private final String description; 
private final double numDoors; 

public Builder(double price, String make, String model) { 
this.price = price; 
this.make = make; 
this.model = model; 
} 

public Builder previousOwner(String previousOwner) { 
this.previousOwner = previousOwner; 
return this; 
} 
// other methods for optional param 

public CarFacts build() { 
return new CarFacts(this); 
} 
} 

private CarFacts(Builder builder) { 
this.price = builder.price; 
//etc. 
} 
} 

Dann habe ich eine Mapper als:

<!-- this doesn't work but I think h3adache suggest that I could have the resultType 
be com.example.model.CarFacts.Builder and use the Builder constructor. But I'm not sure how 
I would call the methods (such previousOwner(String)) to populate optional params --> 

<mapper namespace="com.example.persistence.CarFactsMapper"> 
    <select id="selectCarFacts" resultType="com.example.model.CarFacts"> 
    select * 
    from CarFacts 
    </select> 

</mapper> 

Schließlich habe ich die Mapper-Schnittstelle :

package com.example.persistence.CarFactsMapper; 

public interface CarFactsMapper{ 

List<CarFacts> selectCarFacts(); 

} 

Ich möchte auch Instanzen mit einer statischen Factory-Methode über myBatis erstellen können. Zum Beispiel:

Speziell, wie kann ich myBatis Aufruf newInstance (String, String) haben?

Antwort

-1

Sie müssen keinen Builder oder eine statische Factory-Methode verwenden. Ja, wenn Sie versuchen, diese Muster sicher zu erhalten Hilfe da Mutationen auftreten können, sollen wir sagen "zwischen Instanzen" z. Der Builder wird vor dem Aufruf von build() mutiert (um eine neue unveränderliche Instanz zu erstellen).

Unveränderlichkeit ist jedoch unabhängig davon, wie eine bestimmte Instanz konstruiert wird. Es bringt uns nirgendwo hin, Builder und statische Factory-Methoden für eine Klasse zu schreiben, die änderbar ist. Zum Zeitpunkt der Konstruktion sind alle Objekte noch nicht mutiert und was wirklich zählt, ist, was als nächstes passieren kann (nachdem die Bauarbeiter und Fabriken gegangen sind).

Alles, was Sie tun müssen, ist auf die Klasse selbst konzentrieren und denken, ok ist diese Klasse unveränderlich. Das reguläre myBatis-Mapping sollte in Ordnung sein - sparen Sie sich die Zeit, um einen Builder zu schreiben.

Also - ist Ihre Klasse unveränderlich, nun ja, es ist, da alle Ihre Felder final sind und entweder primitive Typen oder String (was in Java unveränderlich ist!). Wenn Sie andere nicht-primitive Felder hätten, dann würden Sie wollen, dass sie endgültig sind (technisch müssen Sie nicht endgültig schreiben, aber es wird empfohlen, solange das Feld nie wirklich neu zugewiesen wird) und Sie wollen, dass ihre Klasse es tut Folgen Sie einer Rekursion dieser Regeln bis zum Ende.

Ich hoffe, dass dies hilft, der Punkt, den ich vermitteln möchte, ist, dass die Builder-Muster und Factory-Methoden sind gut für die Verwaltung der Konstruktion, aber sie geben Ihnen die Unveränderlichkeit nicht kostenlos und Sie müssen immer einen Konstruktor schreiben.

+0

Dies beantwortet die Frage nicht. –