当前位置: 首页 > 知识库问答 >
问题:

子类化Java Builder类

翟默
2023-03-14
public class NutritionFacts {                                                                                                    

    private final int calories;                                                                                                  

    public static class Builder {                                                                                                
        private int calories = 0;                                                                                                

        public Builder() {}                                                                                                      

        public Builder calories(int val) { calories = val; return this; }                                                                                                                        

        public NutritionFacts build() { return new NutritionFacts(this); }                                                       
    }                                                                                                                            

    protected NutritionFacts(Builder builder) {                                                                                  
        calories = builder.calories;                                                                                             
    }                                                                                                                            
}
public class GMOFacts extends NutritionFacts {                                                                                   

    private final boolean hasGMO;                                                                                                

    public static class Builder extends NutritionFacts.Builder {                                                                 

        private boolean hasGMO = false;                                                                                          

        public Builder() {}                                                                                                      

        public Builder GMO(boolean val) { hasGMO = val; return this; }                                                           

        public GMOFacts build() { return new GMOFacts(this); }                                                                   
    }                                                                                                                            

    protected GMOFacts(Builder builder) {                                                                                        
        super(builder);                                                                                                          
        hasGMO = builder.hasGMO;                                                                                                 
    }                                                                                                                            
}
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);

共有1个答案

单修德
2023-03-14

您可以使用泛型来解决它。我认为这被称为“奇怪的重复泛型模式”

使基类生成器方法的返回类型为泛型参数。

public class NutritionFacts {

    private final int calories;

    public static class Builder<T extends Builder<T>> {

        private int calories = 0;

        public Builder() {}

        public T calories(int val) {
            calories = val;
            return (T) this;
        }

        public NutritionFacts build() { return new NutritionFacts(this); }
    }

    protected NutritionFacts(Builder<?> builder) {
        calories = builder.calories;
    }
}

现在用派生类生成器作为泛型参数实例化基生成器。

public class GMOFacts extends NutritionFacts {

    private final boolean hasGMO;

    public static class Builder extends NutritionFacts.Builder<Builder> {

        private boolean hasGMO = false;

        public Builder() {}

        public Builder GMO(boolean val) {
            hasGMO = val;
            return this;
        }

        public GMOFacts build() { return new GMOFacts(this); }
    }

    protected GMOFacts(Builder builder) {
        super(builder);
        hasGMO = builder.hasGMO;
    }
}
 类似资料:
  • 原文:Subclassing ndarray 介绍 子类化ndarray相对简单,但与其他Python对象相比,它有一些复杂性。 在这个页面上,我们解释了允许你子类化ndarray的机制,以及实现子类的含义。 ndarrays和对象创建 ndarray的子类化很复杂,因为ndarray类的新实例可以以三种不同的方式出现。 这些是: 显式构造函数调用 - 如MySubClass(params)。 这

  • 创建基于对话框的应用程序主要是使用子类化 QDialog 的方法。在本节,我们采用这个方法创建一个稍微复杂的实例-可扩展对话框。 可扩展对话框通常只显示简单的外观,但是它还有一个切换按钮( toggle button), 可以让用户在对话框的简单外观和扩展外观之间来回切换。 可扩展对话框通常用于试图同时 满足普通用户和高级用户需要的应用程序中,这种应用程序通常会隐藏那些高级选项,除非 用户明确要求

  • 问题内容: 给这篇Dobbs博士文章,尤其是Builder模式,我们如何处理将Builder子类化的情况?以该示例的简化版本为例,在该示例中我们想使用子类来添加GMO标签,一个简单的实现将是: 子类: 现在,我们可以编写如下代码: 但是,如果我们弄错了订单,那么一切都会失败: 问题当然是NutritionFacts.Builder返回a NutritionFacts.Builder,而不是a GM

  • 问题内容: 我是java的新手,我试图创建一个XML文档并一遍又一遍地克隆此文档的特定节点(减去textnode)。有人回答了我,说我应该继承节点的子类并覆盖克隆。所以我的问题是 什么是子分类? 问题答案: @Charlie Martin解释了子类化的含义。 但是,尚不清楚您是否得到了很好的建议。如果要通过在内存中组装DOM来创建XML文档,则更好的方法将是使用静态方法创建一个助手类,该类执行需要

  • 本文向大家介绍sprite-kit 子类化SKSpriteNode,包括了sprite-kit 子类化SKSpriteNode的使用技巧和注意事项,需要的朋友参考一下 示例 您可以子类化SKSpriteNode并定义自己的精灵类型。            

  • 问题内容: 我有以下课程: 这可以按预期工作(使用字符串的单词而不是字母来初始化集合)。但是,当我想对set的不可变版本执行相同操作时,该方法似乎被忽略: 我可以达到类似的目的吗? 问题答案: 是的,您需要重写特殊方法: 输出为: