2013-03-28 148 views
8

我有一個(Java)類與許多實例字段(其中許多是可選的)。我希望所有的領域(因此類)都是不可變的。所以,我想用Builder模式來構建類的實例。我可以配置myBatis以使用Builder模式創建類的實例嗎?

我可以配置myBatis以使用Builder模式創建類的實例嗎?我知道我可以讓myBatis返回一張地圖並使用該地圖在我的代碼中構建實例。但是,我正在尋找一種配置此映射(或使用某種約定)的方法,類似於如何通過使用Java Bean和構造函數來創建實例。

編輯(包括一個例子)

下面是一個例子:

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

然後,我有一個映射器爲:

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

最後,我映射器接口:

package com.example.persistence.CarFactsMapper; 

public interface CarFactsMapper{ 

List<CarFacts> selectCarFacts(); 

} 

我也想通過myBatis使用靜態工廠方法創建實例。例如:

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

具體來說,我怎麼能有MyBatis的調用的newInstance(字符串,字符串)?

回答

-1

您不需要使用構建器或靜態工廠方法。是的,如果你試圖保持不變性,這些模式肯定是幫助,因爲可能發生突變,我們應該說'在實例之間',例如因爲構建器在調用build()(創建新的不可變實例)之前正在進行變異。

儘管如此,不變性與給定實例的構造方式無關。它不會讓我們在任何地方爲可變的類編寫構建器和靜態工廠方法。在構建時,所有對象都沒有發生變化,所以真正重要的是接下來會發生什麼(建設者和工廠離開後)。

所有你需要做的就是關注類本身,並認爲好的是這個類不可變。常規的myBatis映射應該沒問題 - 爲自己節省編寫構建器的時間。

所以 - 你的類是不可變的,是的,因爲你的所有字段都是final的,不管是原始類型還是String(在Java中都是不變的!)。如果你有其他非原始字段,那麼你會希望他們是最終的(技術上你不需要寫最後的,但建議,只要該字段從未實際重新分配),你想他們的類去一直遵循這些規則的遞歸。

我希望這會有所幫助,我希望得到的一點是,構建器模式和工廠方法對於管理構造是有好處的,但它們不會爲您提供免費的不變性,而且您始終需要編寫構造函數。

+0

這不回答這個問題。 –

相關問題