2013-03-28 14 views
8

Mam klasy (Java) z wieloma polami instancji (z których wiele jest opcjonalne). Chciałbym, żeby wszystkie pola (w tym klasa) były niezmienne. Tak więc chciałbym użyć wzorca budowniczego do konstruowania instancji klasy.Czy mogę skonfigurować myBatis, aby utworzyć instancję klasy za pomocą wzorca Buildera?

Czy mogę skonfigurować myBatis, aby utworzyć instancję klasy, używając wzorca budowania? Wiem, że mógłbym przywrócić mapę myspace i użyć tej mapy do zbudowania instancji w moim kodzie. Jednak szukam sposobu na skonfigurowanie tego odwzorowania (lub użycia pewnej konwencji) podobnej do tego, jak można utworzyć instancję za pomocą komponentów Java Beans i konstruktorów.

Edit (w tym przykładowe)

Oto przykład:

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

Następnie mam mapowania jako:

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

Wreszcie, mam interfejs odwzorowujący :

package com.example.persistence.CarFactsMapper; 

public interface CarFactsMapper{ 

List<CarFacts> selectCarFacts(); 

} 

Chciałbym również móc tworzyć instancje za pomocą statycznej metody fabularnej za pośrednictwem myBatis. Na przykład:

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); 
} 
} 

W szczególności, w jaki sposób mogę mieć wywołanie myBatis newInstance (String, String)?

Odpowiedz

-1

Nie trzeba używać budowniczych ani statycznych metod fabrycznych. Tak, jeśli próbujesz zachować niezmienność, wzorce te z pewnością mogą być spowodowane mutacjami, powiedzmy "między instancjami", np. ponieważ konstruktor jest mutowany przed wywołaniem funkcji build() (w celu utworzenia nowej niezmiennej instancji).

Niezmienność jest jednak niezależna od sposobu konstruowania danej instancji. Nie pozwala nam nigdzie pisać budowniczych i statycznych metod fabrycznych dla klasy, która jest zmienna. W momencie budowy wszystkie obiekty nie są jeszcze zmutowane i tak naprawdę ważne jest to, co może się wydarzyć później (po tym, jak budowniczowie i fabryki odeszły).

Wszystko, co musisz zrobić, to skupić się na samej klasie i uważać, że ok jest niezmienną klasą. Regularne mapowanie myBatis powinno być w porządku - oszczędzaj sobie czas pisania budowniczego.

A więc - czy twoja klasa jest niezmienna, no tak, ponieważ wszystkie twoje pola są ostateczne i albo typy pierwotne, albo String (który jest niezmienny w Javie!). Jeśli miałbyś inne nieprecyzyjne pola, to chciałbyś, żeby były ostateczne (technicznie nie musisz pisać ostatecznego, ale jest to zalecane, o ile pole nigdy nie jest ponownie przypisane) i chcesz, aby ich klasa wykonaj rekurencję tych reguł w dół.

Mam nadzieję, że to pomoże. Chodzi mi o to, że wzór konstruktora i metody fabryczne są dobre do zarządzania konstrukcją, ale nie dają niezmienności za darmo i zawsze trzeba napisać konstruktora.

+0

To nie odpowiada na pytanie. –

Powiązane problemy