2010-08-09 78 views
4

我正在阅读Joshua Bloch的Effective Java。在16页的顶部,他说:在Effective Java书中实现Builder接口

Note that our NutritionFacts.Builder class could be declared to implement 
Builder<NutritionFacts>. 

但是,不管是“生成器”实现“生成器”界面,因为有一个命名空间冲突存在,如:

public static class Builder implements Builder<NutritionFacts>... 

我应该重新命名内部静态类到像NutritionFacts.NutritionBuilder或什么?

这里是他提供的建造者模式:

// 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; 

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; 

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

回答

4

你可以完全限定接口名。

即:

public static class Builder implements my.package.Builder<NutritionFacts> { 
+0

是啊,我想过 - 但我不知道这是作者的意思。也许他的意思是把建筑师课程移到其他地方?虽然看起来不太可能...... – drozzy 2010-08-10 03:25:44

+0

我不认为移动构建器类会有所帮助,无论它的名称与接口冲突如何。基本上,您的选择是更改类的名称,更改接口的名称或完全限定类声明中的接口。在我看来,对界面进行排位似乎是影响最小的变化 – 2010-08-10 17:10:04