java程序提供默认实现策略,并支持自定义实现策略的一种方式?并如何避雷?

java程序提供默认实现策略,并支持自定义实现策略的一种方式?并如何避雷?

方案?

说明:

当前是基于自定义策略注册由工具类提供,且默认实现策略全局可访问的前提下进行探讨,其他场景也可进行参考,如有问题欢迎指出学习。

方案一: 在默认策略的实现中直接判断当前是否有注册了自定义策略,如果存在则以自定义策略实现为准去调用。(不推荐使用,存在严重问题)—见test1方法。

调用方式:在程序中调用是通过判断自定义策略是否存在,存在时使用自定义策略调用,反之使用默认策略调用。(其实也可直接用默认策略调用)

分析:如果用户在自定义实现中继承默认实现策略类并进行了调用父类方法(即默认策略实现)或特殊分支情况下使用默认策略实现,则会出现双方互相调用的死循环问题。 (除非进行了明确规范和要求并严格检查才不会出现该问题?

方案二: 在默认实现中只关心当前的实现逻辑,不关心自定义策略的调用。(推荐使用)—见test2方法。

调用方式:在程序中调用是通过判断自定义策略是否存在,存在时使用自定义策略调用,反之使用默认策略调用。

分析:无论用户在自定义实现中继承默认实现策略类并进行了调用父类方法(即默认策略实现)或特殊分支情况下使用默认策略实现,都不会出现双方互相调用的死循环问题。并且支持用户在某些特定场景情况下自行实现,其他则使用默认策略实现。

代码示例

public class Test {interface Callback {boolean isTrue(String text);}static void test1() {Callback defaultCallback = new Callback() {@Overridepublic boolean isTrue(String text) {if (InnerUtils.getCustomCallback() != null) {return InnerUtils.getCustomCallback().isTrue(text);}return false;}};Callback customCallback = new Callback() {@Overridepublic boolean isTrue(String text) {if ("A".equals(text)) {return InnerUtils.getDefaultCallback().isTrue(text);}return true;}};InnerUtils.setDefaultCallback(defaultCallback);InnerUtils.setCustomCallback(customCallback);Callback useCallback = customCallback != null ? customCallback : defaultCallback;System.out.println(useCallback.isTrue("B")); // 自定义的自身实现  trueSystem.out.println(useCallback.isTrue("C")); // 自定义的自身实现 trueSystem.out.println(useCallback.isTrue("A")); // 特殊分支,进行调用默认的实现,默认实现中又调用自定义的实现导致死循环 ?? --- StackOverflowError}static void test2() {class DefaultCallback implements Callback {@Overridepublic boolean isTrue(String text) {return false;}}class CustomCallback extends DefaultCallback implements Callback {@Overridepublic boolean isTrue(String text) {if ("A".equals(text)) {return InnerUtils.getDefaultCallback().isTrue(text);}if ("B".equals(text)) {return super.isTrue(text);}return true;}}Callback defaultCallback = new DefaultCallback();Callback customCallback = new CustomCallback();InnerUtils.setDefaultCallback(defaultCallback);InnerUtils.setCustomCallback(customCallback);Callback useCallback = customCallback != null ? customCallback : defaultCallback;System.out.println(useCallback.isTrue("B")); // 特殊分支,进行调用super.isTrue -- 默认的实现 falseSystem.out.println(useCallback.isTrue("C")); // 自定义的自身实现 --  trueSystem.out.println(useCallback.isTrue("A")); // 特殊分支,进行调用defaultCallback.isTrue -- 默认的实现 false}public static void main(String[] args) {System.out.println("------------");System.out.println("----test1执行开始---");try {test1();} catch (Exception | Error e) {System.out.println("test1存在异常: " + e);}System.out.println("----test1执行结束---");System.out.println();System.out.println("------------");System.out.println("----test2执行开始---");test2();System.out.println("----test2执行结束---");System.out.println("------------");}static class InnerUtils {static Callback defaultCallback;static Callback customCallback;public static Callback getDefaultCallback() {return defaultCallback;}public static void setDefaultCallback(Callback defaultCallback) {InnerUtils.defaultCallback = defaultCallback;}public static Callback getCustomCallback() {return customCallback;}public static void setCustomCallback(Callback customCallback) {InnerUtils.customCallback = customCallback;}}
}

执行结果


------------
----test1执行开始---
true
true
test1存在异常: java.lang.StackOverflowError
----test1执行结束---------------
----test2执行开始---
false
true
false
----test2执行结束---
------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

如何秒杀系统架构设计

原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%…

纳什均衡:博弈论中的运作方式、示例以及囚徒困境

文章目录 一、说明二、什么是纳什均衡?2.1 基本概念2.2 关键要点 三、理解纳什均衡四、纳什均衡与主导策略五、纳什均衡的例子六、囚徒困境七、如何原理和应用7.1 博弈论中的纳什均衡是什么?7.2 如何找到纳什均衡?7.3 为什么纳什均衡很重要&a…

素数的无穷大的证明

素数的无穷大——欧几里得的证明 文章目录 一、说明二、欧几里得证据三、哥德巴赫对素数无穷性的证明(1730)四、Frstenberg 对素数无穷性的证明(1955)五、库默尔对欧几里得证明的重述 一、说明 众所周知,素数是无限多的。然而,两…

运维一个宝塔面板的php项目的艰辛历程【解决了http3,ssl,quic】

在这个项目的环境 使用了宝塔面板 有4个php:php5.6,php7.3,php7.4,php8.0 nignx为1.20版本 升级计划: 升级nginx1.26.0版本,添加上http3协议,添加ssl证书 遇到的问题: 升级nginx1.26版本后 无法打开php5.6的后台 原因&#xff…

【知识点】nullptr 和 NULL

在 C 中,nullptr 和 NULL 都可以用来表示空指针,但是它们之间有一些重要的区别。这些区别涉及到类型安全性、代码可读性和在不同版本的 C 中的使用情况。 NULL NULL 是一个宏,通常定义为 0 或 (void*)0,它最初是在 C 语言中引入…

vmware-17虚拟机安装教程,安装linux centos系统

下载VMware 1.进入VMware官网:https://www.vmware.com/sg/products/workstation-pro.html 2.向下翻找到,如下界面并点击“现在安装” 因官网更新页面出现误差,现提供vmware17安装包网盘链接如下: 链接:https://pan.b…

Vue17-条件渲染

一、使用v-show属性做条件渲染 控制元素的显示和隐藏 v-show里面也能是表达式,只要表达式的值是boolean就行。 或者 当时结构还在: 二、使用v-if属性做条件渲染 结构也不在了 三、示例 方式一: 方式二: 当元素有很高的切换频率&am…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(四)

上一章节我们了解了 shuffle 相关的概念和原理后其实可以发现一个问题,那就是 shuffle 比较容易造成数据倾斜的情况。 例如上一节我们看到的图,在这批数据中,hello 这个单词的行占据了绝大部分,当我们执行 groupByKey 的时候触发了…

刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)

📣德勤 2024暑期实习测评已发,正在申请的小伙伴看过来哦👀 ㊙️本次暑期实习优先考虑2025年本科及以上学历的毕业生,此次只有“审计及鉴定”“税务与商务咨询”两个部门开放了岗位~ ⚠️测评注意事项: &#x1f44…

pdf分割为bmp

import fitz # PyMuPDF import os from PIL import Imagedef convert_pdf_to_bmp(pdf_path, output_folder):"""将单个PDF文件的每一页转换为BMP格式的图像。:param pdf_path: PDF文件的路径。:param output_folder: 保存BMP图像的输出文件夹路径。""…

简单了解java中的正则表达式

正则表达式 1、正则表达式认识 正则表达式通常用来校验,检查字符串是否符合规则,由一些特定的字符组成的字符串校验规则,就称之为正则表达式。 2、正则表达式能干啥? 正则表达式只能针对字符串格式进行校验,所以它…

使用Nextjs学习(学习+项目完整版本)

创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…

独孤思维:副业圈很多骗子

01 副业圈鱼龙混杂,别没事和别人撕b。 不认可就退群,取关。 和一个垃圾人互怼,爆粗口,耗费的是自己的体力和时间。 结果也只会一地鸡毛,得不偿失。 专注,只服务于认可你的人,只付费你认可的…

C#面:什么是DLL文件,使用它们有什么好处

在C#中,DLL(Dynamic Link Library)文件是一种可重用的代码库,它包含了已编译的函数、类、数据和资源。DLL文件可以被多个应用程序共享和重用,这样可以提高代码的复用性和可维护性。 使用DLL文件有以下几个好处&#x…

【LeetCode算法】第112题:路径总和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:二叉树先序遍历。首先访问根节点,若根节点是叶子节点并且值等于目标值,则返回true,否则递归访问左子树和右子树,只要左…

TCP/UDP的区别

首先来介绍一下什么是TCP和UDP TCP(传输控制协议)和UDP(用户数据报协议)是互联网协议套件中两个重要的传输层协议。它们在数据传输的方式、可靠性、连接性等方面有显著的区别。 总之他们两个就是个协议,协议也就是数…

PG 数据库常用参数调整

1.shard_buffers Postgresql使用自己的缓冲区,也使用操作系统缓冲区。这意味着数据存储在内存中两次,首先是 Postgresql缓冲区,然后是操作系统缓冲区。 与其他数据库不同, Postgresql不提供直接IO。这称为双缓冲(就是磁盘中的时候读的时候先放在数据库的缓冲区&am…

【上下界分析 差分数组】798得分最高的最小轮调

本文涉及知识点 差分数组 本题同解 C算法前缀和的应用:798得分最高的最小轮调 LeetCode798得分最高的最小轮调 给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调,这样可以使数组变为 [nums[k], nums[k 1], … nums[nums.lengt…

leetcode168:Excel表列名称

题目链接&#xff1a;168. Excel表列名称 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convertToTitle(int columnNumber) {string ss1;int MOD 0;if(columnNumber < 26){ss1 (columnNumber A - 1);return ss1;}while(columnNumber){int MO…