首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何摆脱这个Builder实现中的instanceof

要摆脱Builder实现中的instanceof,可以使用多态性。具体来说,可以使用接口和抽象类来实现。

首先,可以定义一个接口或抽象类,该接口或抽象类包含了所有Builder实现中需要的方法。然后,可以让每个Builder实现该接口或抽象类,并实现其中的方法。

在使用Builder实现时,可以将其定义为接口或抽象类的类型,而不是具体的Builder实现。这样,就可以避免使用instanceof来判断Builder实现的类型,而是使用多态性来调用其方法。

例如,假设有一个Builder接口,其中包含了一个build()方法:

代码语言:java
复制
public interface Builder {
    public Object build();
}

然后,可以让每个Builder实现该接口,并实现其中的build()方法:

代码语言:java
复制
public class ConcreteBuilder1 implements Builder {
    public Object build() {
        // 实现Builder1的build()方法
    }
}

public class ConcreteBuilder2 implements Builder {
    public Object build() {
        // 实现Builder2的build()方法
    }
}

在使用Builder实现时,可以将其定义为Builder类型,而不是具体的Builder实现:

代码语言:java
复制
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Object construct() {
        return builder.build();
    }
}

这样,就可以避免使用instanceof来判断Builder实现的类型,而是使用多态性来调用其build()方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

技巧 | C++实现类似instanceof方法

前言 C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型时候,这个时候就希望C++ 可以向Java或者Python中有instanceof这个函数...,可实际上C++没有。...但是别着急,其实C++中有两种简单方法可以实现类似Javainstanceof功能。 在 C++ ,确定对象类型是编程实际需求,使开发人员能够做出动态决策并执行特定于类型操作。...无论是在编译时检查类型,还是在运行时动态标识对象类型,C++ 都提供了强大机制来获取类型信息 使用typeid.name()方法 寻找实例类类型,代码演示如下: 使用std::is_same方法 代码实现与运行效果如下...: 使用dynamic_cast dynamic_cast方法转型是C++中一种非常杰出方法。

8110

Go循环依赖:如何解决这个问题

作为一个 Golang 开发,你可能在项目中遇到过包循环依赖问题。Golang 不允许循环依赖,如果检测到代码存在这种情况,在编译时就会抛出异常。本文会讨论循环依赖是如何发生以及如何处理。...比起代码执行速度,Go语言更关注如何快速编译(甚至愿意牺牲一些运行时性能来换取更快构建速度)。...为什么Go不显示导致错误原因呢?原因是在循环依赖并不是只有一个源文件。 但Go语言会在报错信息告诉你导致问题package名,因此可以通过包名来解决问题。...但很多时候它增加了代码重复性,要使用这种方法的话需要牢记你代码结构(原文没有提供三个包例子,可以在这个查看三个包例子:https://github.com/yigenshutiao/Go-design-codes...这个特殊指令作用域不是紧跟下一行代码,而是在同一个包下生效。

9.5K21

Elasticsearch 8.X:这个复杂检索需求如何实现

3、实现讨论 针对需求 2,这个设置权重就可以实现。...针对需求 3,这个 TF-IDF 机制决定,检索后结果自然满足,也就是评分逻辑就是基于这个实现(后续升级为BM25模型,原理一致),咱们不用动就可以。 针对需求 4,加个时间排序就可以。...更合适方式可能是结合应用层逻辑来实现这一需求。 一般遇到类似问题,就得有理有据和产品经理讨论清楚需求,不要任凭产品经理“瞎指挥、瞎忽悠”。 那么借助脚本如何实现呢?...2 使用JavaindexOf方法,找到"小学"在"title"位置,并将这个位置存储在indexSchool变量。...3 使用同样方法,找到"天天"在"title"位置,并将这个位置存储在indexKeyword变量。 4 判断两个关键字位置:如果"小学"在"天天"之前,返回1。

39160

JSsetTimeout是如何实现

我们知道 Javascript引擎是单线程,而setTimeout方法作用是延后执行目标代码,同时还可以继续往下执行 setTimeout是如何实现?...这涉及到了浏览器内核事件循环模型,在Javascript引擎之外,有一个任务队列,当执行到setTimeout时,延时方法会交给内核其他模块处理(与执行引擎主线程独立),当延时方法到达触发条件,这一延时方法被添加至任务队列里...,执行引擎在主线程方法执行完毕后,会从任务队列顺序获取任务来执行,这一过程是一个不断循环过程,称为事件循环模型 下面通过一段示例代码,看一下整个执行过程 console.log('1'); setTimeout...(5)执行引擎执行栈为空后,引擎开始轮询检查任务队列是否有任务需要被执行,就检查到延时方法test,于是将延时方法加入执行栈,test方法调用了log()方法,于是又将log(2)方法入栈执行,输出2

3.3K80

为什么实现 .NET ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?

不过这个设计让线程安全访问有集合实现方转嫁到了调用方,导致要么很难实现,要么很难调用。...虽然泛型版本 ICollection 已经改进了设计,不再引入 SyncRoot 这样属性到接口中,但如果我们在某些场景下需要实现 ICollection 非泛型集合时,如何正确实现 SyncRoot...---- 先上结论: —— 不可能正确实现 SyncRoot 模式 在多线程程序设计,为了在保证线程安全同时避免死锁,不应该公开同步锁。...结合 .NET Core 源代码一些常用写法,我给出一个推荐 SyncRoot 模式写法: // Is this List synchronized (thread-safe)?...然而这个属性都是 public 了,不管返回什么,与 this 还有什么区别…… 关于为什么同步时不应该返回 this 或者返回公开对象,原因可以看我另一篇博客: 为什么不应该公开用来同步加锁对象

81130

PostgreSQLWaitEventSet超时如何实现

PostgreSQLWaitEventSet超时如何实现 WaitEventSet等待超时如何实现?...我们了解到,它和epoll有关,首先先了解下epoll_wait这个函数: int epoll_wait( int epfd,//epoll_create函数返回epoll实例句柄 struct...Epoll将发生事件集合从内核复制到该数组 int maxevents, //本次可以返回最大事件数目 int timeout//超时时间。...-1:阻塞;0:不阻塞;>0:等待超时时间,单位ms ); 返回值:0:表示等待超时;>0:返回需要处理事件数目;-1:出错 错误标签: EBADF:epfd是一个非法文件描述符 EFAULT:事件指向内存区域无法使用写权限访问...EINTR:请求任何事件发生前或者超时到期前,调用被信号处理程序中断 EINVAL:epdf不是epoll文件描述符,或者maxevents <=0 WaitEventSetWait if (timeout

19320

JavaLambda是如何实现

在上面的字节码,我们可以看到一个名为 lambdamain0 方法,该方法是在编译阶段自动生成,其对应于示例源码lambda方法体。...在main方法字节码,invokedynamic是整个lambda实现关键,不过由于该字节码在JVM实现逻辑非常复杂,在这里我们就不看具体代码了,只说下大致思路。...该字节码最终目的是为了创建一个对象,且该对象要实现java.util.function.Consumer接口,这样这个对象才可以赋值给上面示例源码 Consumer c 变量。...那这个对象对应类是哪里来呢?对,也是动态生成。...依据上面的示例,我们再来总结下lambda是如何实现: 在编译阶段,javac会自动生成一个lambdamain0方法,该方法对应了lambda方法体。

1.1K30

MySQLinsertOrUpdate功能如何实现

insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现呢,不知道大家有没有考虑过呢? 在 MySQL ,可采用INSERT INTO ......ON DUPLICATE KEY UPDATE语句实现 insertOrUpdate 功能。 值得留意是,在出现重复键时,会在先前索引值和当前值之间添加临时键锁,这可能导致死锁。...ON DUPLICATE KEY UPDATE语句,如果数据库已存在具有相同唯一索引或主键记录,则更新该记录。其底层原理和执行流程如下: 检查唯一索引或主键:执行INSERT INTO ......在此过程,数据库会检查表是否存在与新插入行具有相同唯一索引或主键记录。 冲突处理:如果不存在冲突唯一索引或主键,新行将被正常插入。...这是因为 MySQL 在尝试插入新记录时,会先分配一个新自增主键值,无论后续是插入成功还是执行更新操作,这个主键值都已经被分配并且会增加。

11510

通过照片内容搜图,Facebook这个新技能是如何实现

新功能详解 为了实现这个功能,Facebook使用了上百万张照片来训练深度神经网络,好在他们平台上已经有数十亿张加了标题图片。...将搜索词和照片匹配起来之后,Facebook模型使用图片本身和原有搜索信息来对搜索结果进行排序,另外,他们在排序还考虑到了照片多样性,以确保用户不会连续看50张照片都是同一个东西,只在焦距和角度上略有不同...这一技术可能用在个人情境,比如说帮用户搜索朋友视频,找到她吹灭生日蜡烛那一刻;也可能用于商业情境,有助于提升Facebook信息流广告营收天花板。...最终,我们将看到一个完全整合系统,在这个系统,我们可以提取信息,比如说从视频搜索一件你非常喜欢裙子,然后把它链接到市场上商品,甚至把你和广告合作商直接连接起来以增进用户体验、保持营收增长。...去年四月推出时,这个为图片生成文字描述工具只能告诉用户图片里有等、台阶等物体,但不太会描述物体动作。 为了解决这个问题,Facebook一个团队手工标注了平台上130000张照片。

4.6K100

Github 精选 | 如何干掉 shape.xml 文件?

除了 xml 基本使用外,BackgroundLibrary 还提供了完善配套支持。 可以通过代码直接生成 Drawable 。...//设置button圆角背景 Drawable drawable = new DrawableCreator.Builder().setCornersRadius(dip2px(20))...提供了预览功能,但是需要把原来View换成框架内对应BLView,这存在一定成本 。 综合来说,还是一个相当不错工具库,可以摆脱繁杂 shape.xml 编写工作,但并不可能完全替代。...原理 BackgroundLibrary 原理还是很巧妙。两个关键词:自动初始化、自动解析属性 。你可以先不往后看,停下来思考一下如何实现。...} return inflater; } ... } 如果你知道 AppcompatActivity 是如何 在运行时自动把 xml 文件 TextView 转换成 AppcompatTextView

49020

如何实现VM框架数据绑定

作者:佳杰 本文原创,转载请注明作者及出处 如何实现VM框架数据绑定 一:数据绑定概述 视图(view)和数据(model)之间绑定 二:数据绑定目的 不用手动调用方法渲染视图,提高开发效率;...发布订阅模式(backbone.js用到); 2.数据劫持(vue.js用到); 3.脏值检查(angular.js用到); 六:model > view数据绑定demo讲解 (如何实现数据改变...,defineProperty用于“监控model", dom元素执行"订阅"操作,给model 属性绑定function;model属性变化时候,执行"发布"这个操作,执行之前绑定那个...,但又不想费劲地查找dom元素再去修改元素值, 这种情况下,可以用demo数据绑定,只需修改数据值,就实现了页面元素重新渲染 请看下面的gif动画中展示,只要修改data.age和data.name...结束语 本demo只是简单实现数据绑定,很多功能并未实现,只是提供一种思路,抛砖引玉; 如果对上述代码Observer类代码不是很理解,可以先了解下观察者模式以及实现原理; 最后,感谢大家阅读

3.2K80

如何实现属性自动计算

我们希望能够通过一种简便方法自动计算这些属性,而无需手动编写每个属性计算方法。2、解决方案有几种方法可以实现属性自动计算。1、使用魔法方法__getattr__。...我们通过创建一个名为calculate_attr类装饰器来实现属性自动计算。...我们通过创建一个名为MetaCalculateAttr元类来实现属性自动计算。...元类是一个特殊类,它可以用来创建其他类。在上面的代码,MetaCalculateAttr元类通过重写__new__方法来实现属性自动计算。...如果只需要实现少数几个属性自动计算,可以使用魔法方法__getattr__。如果需要实现大量属性自动计算,可以使用类装饰器或元类。

14810

如何实现string类?

个人主页: :✨✨✨初阶牛✨✨✨ 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 本篇简介:>:讲解如何模拟实现C++string类....申请一块为_capacity+1大小空间.(+1是为了存储'\0') 将字符串值按字节拷贝至string类_str....代码实现: //全缺省构造函数,,默认初始化为空字符 string(const char* str = "")//无参也是调用这个 { _size = strlen(str);...迭代器作用类似于指针,可以通过解引用操作符(*)获取容器元素值,也可以通过自增操作符(++)移动迭代器指向下一个元素。迭代器可以访问容器元素,也可以修改容器元素值。...(*this == s); } 博主能力有限,无法严格按照库方法实现,比如采用内存池等技术,还有部分函数并未实现,模拟实现string目的只是为了我们更好理解string类,而不是真正让我们去写一个库函数

16110

android内存缓存是如何实现

先找到数组对应index,然后把数据放到链表最后位置。由于是双向链表,那么就等于放在header.prv 2.获取一个数据。先找到数组对应index,然后找到数据所在位置。...如果是按照读取顺序来排序,那么还要将这个节点放到双向链表最后一位(这个特性,可以实现LRU算法) public class LruCache { //map用来存储外界缓存对象...key == null"); } V mapValue; synchronized (this) { //设置为true了,还要将这个节点放到双向链表最后一位...当添加缓存时,先添加数据,再把对应entry挪到双向链表末尾。如果size超过最大值,就删除header.next 当获取缓存时,先获取数据。...由于设置为true,那么也会将对应entry挪到双向链表末尾

1K60

SQL如何实现Excel分列功能?

我们在处理SQL里数据时候,时不时会遇到对字符串进行分割情况。类似Excel按指定字符进行分列,今天给大家介绍两种处理方法。...借助Excel进行分割 先将数据从数据库导出到Excel,使用Excel进行分列后再导入到数据库。注意再次导入需要改变表结构,因为分列后数据字段变多了,必须新建列进行匹配。...使用函数进行分割 使用CHARINDEX函数,CHARINDEX函数作用是如果能够找到对应字符串,就返回该字符串位置,否则返回0....:是被查找字符串 start_location:开始查找起始位置,默认为空表示从第一位开始查找 例如: SELECT CHARINDEX('Road','SQL_Road') 返回结果为:5...方法固定,如果是对其他符号进行分列,只需要修改其中符号即可。 以上就是两种我常使用办法,希望对大家有帮助。

9510
领券