android——【封装】使用建造者方式封装一个类

 前言

在Kotlin中,使用建造者模式来封装一个类有以下几个好处:

  1. 简化对象的创建过程:使用建造者模式可以将复杂的对象创建过程分解为多个简单的步骤,使得代码更加清晰易读。通过链式调用,可以按需设置对象的属性,而不需要记住每个属性的顺序和参数。

  2. 提供可选参数:建造者模式可以让你在创建对象时只设置必要的参数,而将其他参数设置为可选。这样可以避免创建多个构造函数或者使用大量的重载方法。

  3. 保证对象的一致性:建造者模式可以确保在对象创建过程中,对象始终处于一致的状态。在每个步骤中,可以进行必要的验证和处理,以确保对象的属性符合要求。

  4. 支持不可变性:通过将对象的属性设置为只读,建造者模式可以创建不可变的对象。这样可以提高代码的安全性和线程安全性。

  5. 可扩展性:如果需要添加新的属性或者修改现有属性,只需要在建造者类中添加相应的方法即可,而不需要修改已有的代码。这样可以降低代码的耦合性,并且方便后续的扩展和维护。

示例代码为:

class LogRYB private constructor(private val rootPath: String,private val errorPath: String?,private val userInterceptor: (String) -> Unit,private val ptlInterceptor: (String) -> Unit,private val apiInterceptor: (String) -> Unit
) {private const val TAG = "RYBApp"private var level = Level.Infoprivate var mUserName = "" // BaseFunction.getNowUser() 写入日志文件用,标志谁操作private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())// 私有构造函数,防止外部直接实例化private LogRYB() {}// 静态内部类作为建造者class Builder {private var rootPath: String? = nullprivate var errorPath: String? = nullprivate var userInterceptor: (String) -> Unit = {}private var ptlInterceptor: (String) -> Unit = {}private var apiInterceptor: (String) -> Unit = {}fun setRootPath(rootPath: String): Builder {this.rootPath = rootPathreturn this}fun setErrorPath(errorPath: String?): Builder {this.errorPath = errorPathreturn this}fun setUserInterceptor(interceptor: (String) -> Unit): Builder {this.userInterceptor = interceptorreturn this}fun setPtlInterceptor(interceptor: (String) -> Unit): Builder {this.ptlInterceptor = interceptorreturn this}fun setApiInterceptor(interceptor: (String) -> Unit): Builder {this.apiInterceptor = interceptorreturn this}// 构建并返回 LogRYB 实例fun build(): LogRYB {requireNotNull(rootPath) { "RootPath must be set" }return LogRYB(rootPath, errorPath, userInterceptor, ptlInterceptor, apiInterceptor)}}// 初始化日志的方法移到内部,由建造者调用private fun initLogPath(rootPath: String, errorPath: String?) {// 初始化日志文件保存路径的逻辑}// 用户日志方法保持不变fun userLog(message: String,tag: String = TAG,userName: String = mUserName,status: Boolean = false) {log(message, tag)scope.launch {writeLog("【用户: $userName】 [$message], [状态: ${if (status) "成功" else "失败"}]")mUserInterceptor(message)}}// 其他方法和属性保持不变
}// 使用示例
fun main() {val logRYB = LogRYB.Builder().setRootPath("/path/to/logs").setErrorPath("/path/to/error/logs").setUserInterceptor { message ->// 处理用户日志的逻辑}.setPtlInterceptor { message ->// 处理PTL日志的逻辑}.setApiInterceptor { message ->// 处理API日志的逻辑}.build()logRYB.userLog("This is a user log message")
}

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

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

相关文章

HBase的Python API(happybase)操作

一、Windows下安装Python库:happybase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase,需要开启HBase的Thrift服务。所以,在Linux服务器上,执行如…

香港高才通计划abc类的申请材料各不同,附官方续签攻略!

香港高才通计划abc类的申请材料各不同,附官方续签攻略! 作为香港“史上最快获批签证”,高才通计划受到内地精英的热烈欢迎,香港高才通于2022年12月28日开放申请,截至2023年12月31日,香港高才通计划已接获62…

android 11 SystemUI 状态栏打开之后的界面层级关系说明之一

比如WiFi 图标的父layout为: Class Name: ButtonRelativeLayout Class Name: QSTileView Class Name: TilePage Class Name: PagedTileLayout Class Name: QSPanel Class Name: NonInterceptingScrollView Class Name: QSContainerImpl Class Name: FrameLayout Cl…

37.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-解码器细化类的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:36.数据解码器的…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶:Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

今天起,Windows可以一键召唤GPT-4了

现在,OpenAI 大模型加持的 Copilot 功能终于登陆 Windows 了。 把 Copilot 按钮放在 Windows 桌面的任务栏,甚至实体键盘上,用大模型提升每个人的生产效率。 美东时间 3 月 21 日周四,生成式 AI 领军的微软又为我们带来了一点小…

Web系统开发之——文章管理

原文地址:Web系统开发之——文章管理 - Pleasure的博客 下面是正文内容: 前言 经过一番考量,关于Web应用系统功能部分的开发,决定采取基础的文字文章管理为核心功能。 不再采取前后端分阶段完成的方式,而是以一个一个…

MyBatis基本开发步骤

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default"…

【QT入门】 QTabWidget各种常见用法详解

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解 一般来说&#xff0c;学一个新的控…

报错there is no HDFS_NAMENODE_USER defined

在Hadoop安装目录下找到sbin文件夹&#xff0c;修改里面的四个文件 1、对于start-dfs.sh和stop-dfs.sh文件&#xff0c;添加下列参数&#xff1a; HDFS_DATANODE_USERroot HDFS_DATANODE_SECURE_USERhdfs HDFS_NAMENODE_USERroot HDFS_SECONDARYNAMENODE_USERroot 2、对于st…

2024-2029年中国中子探测器行业市场深度调研及发展前景预测报告

中子探测器可应用范围广泛 全球市场规模持续扩大 中子探测器&#xff0c;是一种检测中子辐射的仪器&#xff0c;采用中子吸收材料&#xff0c;利用中子与材料相互作用&#xff0c;来检测是否存在中子以及中子能量强度。中子是不带电荷的粒子&#xff0c;无法利用电离辐射探测器…

20221124 kafka实时数据写入Redis

一、上线结论 实现了将用户线上实时浏览的沉浸式视频信息&#xff0c;保存在Redis中这样一个功能。为实现沉浸式视频离线推荐到实时推荐提供了强有力的支持。目前只是应用在沉浸式场景&#xff0c;后续也能扩展到其他所有场景。用于两个场景&#xff1a;&#xff08;1&#xf…

2024年天津财经大学珠江学院退役大学生士兵专升本专业课报名须知

天津财经大学珠江学院2024年高职升本科&#xff08;面向退役大学生士兵&#xff09;职业技能综合考查报考须知 一、报名条件 报考天津财经大学珠江学院2024年高职升本科职业技能综合考查的退役大学生士兵应符合天津市及我院规定的报考资格。考生须完成天津市高职升本科文化考…

数据结构/C++:位图 布隆过滤器

数据结构/C&#xff1a;位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系&#xff0c;实现了O(1)的复杂度来查找数据。相比于其它数据结构&#xff0c;哈希在实践中是一个非常重要的思想&#xff0c;本博客将介绍哈希思想的两大应用&#xff0c;位图…

HTTPS:原理、使用方法及安全威胁

文章目录 一、HTTPS技术原理1.1 主要技术原理1.2 HTTPS的工作过程1.2.1 握手阶段1.2.2 数据传输阶段 1.3 CA证书的签发流程1.4 HTTPS的安全性 二、HTTPS使用方法三、HTTPS安全威胁四、总结 HTTPS&#xff08;全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket …

git提交-分支开发合并-控制台操作

git提交-分支开发合并-控制台操作 git的基本概念工作区、暂存区和版本库工作区&#xff1a;就是你在电脑里能看到的目录&#xff08;隐藏目录 .git不算工作区&#xff09;。暂存区&#xff1a;英文叫 stage 或 index。一般存放在本地的.git目录下的index 文件&#xff08;.git/…

深入探索React Hooks:关键技术点与实战应用

引言 随着React v16.8版本的到来&#xff0c;React Hooks这一革命性的新特性彻底改变了我们构建和管理React应用状态的方式。Hooks不仅简化了函数组件的复杂逻辑&#xff0c;还极大地提升了代码的复用性和可读性。本文将带你深入了解React Hooks的核心技术要点&#xff0c;并结…

Chrome的Console控制台添加页面对JQuery的支持

复制下面一行代码&#xff0c;在console中粘贴&#xff0c;回车。即可开始愉快的使用 $ var importJsdocument.createElement(script);importJs.setAttribute("type","text/javascript");importJs.setAttribute("src", https://ajax.microsoft.c…

036—pandas 按行将列名根据值由大到小排序

前言 数据处理中&#xff0c;按行排列的列名可以提供更直观的数据探索和分析方式。 你可以逐行查看列名&#xff0c;了解每列的含义和特征&#xff0c;有助于更好地理解数据集的结构和内容。 需求&#xff1a; 需要增加一列「分布方式」&#xff0c;每行的值是本行基金名称对…