2013-03-28 16 views
8

Ho una classe (Java) con molti campi di istanza (molti dei quali sono facoltativi). Vorrei che tutti i campi (quindi di classe) fossero immutabili. Quindi, mi piacerebbe usare il Pattern Builder per costruire istanze della classe.Posso configurare myBatis per creare un'istanza di una classe utilizzando il pattern Builder?

Posso configurare myBatis per creare un'istanza di una classe utilizzando il modello di generatore? So che potrei avere myBatis restituire una mappa e usare quella mappa per costruire nell'istanza nel mio codice. Tuttavia, sto cercando un modo per configurare questa mappatura (o usare qualche convenzione) simile a come posso creare un'istanza tramite l'uso di Java Beans e costruttori.

Edit (per includere un esempio)

Ecco un esempio:

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. 
} 
} 

Poi, ho un mapper come:

<!-- 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> 

Infine, ho l'interfaccia mapper :

package com.example.persistence.CarFactsMapper; 

public interface CarFactsMapper{ 

List<CarFacts> selectCarFacts(); 

} 

Vorrei anche essere in grado di creare istanze utilizzando un metodo factory statico tramite myBatis. Ad esempio:

public final class Person { 

private final String lastName; 
private final String firstName; 

private Person(String lastName, String firstName) { 
this.lastName = lastName; 
this.firstName = firstName; 
} 

public Person newInstance(String lastName, String firstName) { 
return new Person(lastName, firstName); 
} 
} 

In particolare, come posso chiamare myBatis newInstance (String, String)?

risposta

-1

Non è necessario utilizzare un costruttore o un metodo di produzione statico. Sì, se stai cercando di mantenere l'immutabilità, questi modelli certamente aiutano poiché possono verificarsi mutazioni, dovremmo dire "tra istanze", ad es. mentre il builder viene mutato prima della sua chiamata a build() (per creare una nuova istanza immutabile).

Tuttavia, l'immutabilità è indipendente dal modo in cui viene creata una determinata istanza. Non ci porta da nessuna parte a scrivere costruttori e metodi di factory static per una classe che è mutabile. Al momento della costruzione, tutti gli oggetti non sono ancora mutati e quindi ciò che conta davvero è ciò che può accadere dopo (dopo che i costruttori e le fabbriche sono usciti).

Tutto quello che devi fare è concentrarti sulla classe stessa e pensare che questa classe sia Immutabile. La normale mappatura di myBatis dovrebbe andare bene - risparmia te stesso il tempo di scrivere un costruttore.

Quindi, la tua classe è immutabile, beh, sì, perché tutti i tuoi campi sono definitivi e tipi primitivi o String (che è immutabile in Java!). Se avessi altri campi non primitivi, vorresti che fossero definitivi (tecnicamente non hai bisogno di scrivere la finale, ma è consigliabile, a patto che il campo non sia mai effettivamente riassegnato) e vorresti che la loro classe seguire una ricorsione di queste regole fino in fondo.

Spero che questo aiuti, il punto che voglio superare è che il modello di builder ei metodi di fabbrica sono buoni per la gestione della costruzione ma non ti danno l'immutabilità gratis e hai sempre bisogno di scrivere un costruttore.

+0

Questo non risponde alla domanda. –