Tôi sử dụng mẫu trình xây dựng Java do Joshua Bloch giới thiệu. Đôi khi, tôi tìm thấy một số lĩnh vực đắt tiền hơn để được khởi tạo với giá trị mặc định so với các loại nguyên thủy.Một số sửa đổi trên mẫu Builder được giới thiệu bởi Joshua Bloch
Do đó, chiến lược của tôi là gì.
- Tôi trì hoãn hoạt động khởi tạo giá trị mặc định cho các trường đó.
- Trong khi xây dựng, tôi sẽ chỉ khởi tạo chúng thành giá trị mặc định, nếu chúng không được đặt trước bởi người gọi.
Tôi không chắc liệu đó là tốt để làm như vậy? Có bất kỳ bắt có thể xảy ra? Giống như, vấn đề an toàn chủ đề? Cho đến nay, tôi không thấy bất kỳ vấn đề với điều này.
package sandbox;
import java.util.Calendar;
/**
*
* @author yccheok
*/
// Builder Pattern
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
private final java.util.Calendar calendar; // !!!
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
// We suppose to provide a default value for calendar. However, it may
// seem expensive. We will do it later during build.
private java.util.Calendar calendar = null;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }
public NutritionFacts build() {
// !!!
if (this.calendar == null) {
this.calendar = Calendar.getInstance();
}
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
calendar = builder.calendar;
}
}
OK. Điều này nhắc tôi. Có lẽ tôi nên đặt một cờ boolean là bẩn khi người dùng thiết lập lịch một cách rõ ràng. Sau đó, trong quá trình xây dựng, tôi sẽ kiểm tra cờ boolean? –
Vâng, tôi đoán rằng nó sẽ hoạt động – nanda