2010-09-15 19 views
5

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

  1. Tôi trì hoãn hoạt động khởi tạo giá trị mặc định cho các trường đó.
  2. 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; 
    } 
} 

Trả lời

4

nếu tôi thực sự muốn lịch bị rỗng? Mẫu của bạn sẽ không hoạt động sau đó. Nếu không, có vẻ như ổn với tôi.

+1

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? –

+0

Vâng, tôi đoán rằng nó sẽ hoạt động – nanda

3

Tôi không thấy vấn đề gì với nó. Mẫu Builder thực sự là một API giúp với các tác vụ nhất định. Bạn có thể làm bất cứ điều gì bạn muốn trong phạm vi của API miễn là bạn tuân thủ các nguyên tắc của mẫu/API. Tôi nghĩ việc tải các tài nguyên đắt tiền là tốt, chỉ cần đảm bảo bạn ghi lại bất kỳ hành vi nào mà bạn nghĩ rằng các nhà phát triển nên biết.

2

Hãy cẩn thận vì Lịch có thể thay đổi, vì vậy bạn nên sao chép phòng thủ trong trình tạo hàm NutritionFacts.

Các vấn đề liên quan