开发者社区> 喵叔哟> 正文

整合重复的初始化逻辑

简介: 整合重复的初始化逻辑
+关注继续查看

我们在开发中会在一个类中定义不同版本的构造函数,这些构造函数往往存在相同的初始化逻辑。遇到这种情况一部分开发人员会在每个构造函数中编写相同的代码,这种编写代码的方式是比较低级的,正确的做法应该是将相同的初始化逻辑提取到一个公用的构造函数中,并让其他构造函数直接或间接的调用。这样既可以减少重复的代码,又可以使得编译器根据初始化命令生成更高效的目标代码。下面我们就根据上面所说的内容来编写一下代码。

public class Demo
{
    private List<int> data;
    private string name;
    public Demo()
        :this(0,"")
    {}
    
    public Demo(int initCount)
        :this(initCount,string.Empty)
    {}
    public Demo(int initCount,string name)
    {
        data = initCount>0?new List<int>(initCount):new List<int>();
        this.name=name;
    }
}

我们使用上面的方式来编写构造函数的话,我们需要考虑不同参数的组合形式,也就是说我们需要提供无参的构造函数、只包含 initCount 参数的构造函数、只包含 name 参数的构造函数,以及同时包含这两个参数的构造函数。那么,如果类中新增了一个新的成员,这时我们就需要编写更多的构造函数来适应更多的参数组合。遇到这种情况我们就应该在开发中编写带有默认值的构造函数,这样调用方使用我们编写的构造函数的时候会很灵活。对于开发这个类的开发人员来说减少了代码的编写量。下面我们就来改写一下上面的代码。

pblic class Demo
{
    private List<int> data;
    private string name;
    public Demo()
        :this(0,string.Empty)
    {}
    public Demo(int initCount=0,string name="")
    {
        data = initCount>0?new List<int>(initCount):new List<int>();
        this.name=name;
    }
}

Tip: 这里需要注意的是,如果我们想让调用方通过 new Demo() 的写法调用函数的话就必须显示定义无参构造函数。


带有默认值参数的构造函数虽好,但是他也有缺点。他会令客户端代码和该类高耦合,尤其是会令型形参的名称和默认值成为公共接口的一部分,如果修改了默认值那么客户端就必须重新编译一遍才能使那些使用旧默认值的代码转而使用新的默认值,那么这时使用重载构造函数的方法是最好的。对于上面的代码来说使用参数默认值机制来编写构造函数是最好的方式,但是有些 API 会使用反射创建对象,这时就需要依赖于无参构造函数,但是这又出现了文章一开始所提到的问题–代码重复。要避免这个问题我们可以使用链式调用,也就是说用一个构造函数去调用本类的另一个构造函数,看到这里一定会有读者会说我们可以将公用代码提取到一个方法中,构造函数调用这个方法,何必用链式调用呢?这种方式虽然和链式调用的效果类似但是效率很低,这是因为编译器会在每个构造函数里都执行同一个操作,也就是说要添加语句来设定各种变量的初始值并调用基类的构造函数,进而在每个构造函数里都执行一遍这个代码。而是用链式调用的方法编译器不会在每个构造函数里都去调用基类的构造函数,也不会把初始化成员变量所需要的逻辑在每个构造函数中重复一遍,它只会在最后那个构造函数里调用基类的构造函数。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
18663 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
21548 0
整合重复的初始化逻辑
整合重复的初始化逻辑
1136 0
微信小程序开发系列四:微信小程序之控制器的初始化逻辑
微信小程序开发系列四:微信小程序之控制器的初始化逻辑
26 0
Action Framework Medium attribute 初始化逻辑
Created by Jerry Wang, last modified on May 05, 2014
36 0
Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
31 0
微信小程序开发系列四:微信小程序之控制器的初始化逻辑
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法
18 0
SAP UI5 router的初始化逻辑
Sent: Wednesday, March 4, 2015 12:07 PM
21 0
+关注
314
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载
http://www.vxiaotou.com