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

Effective Java 2.0_Item 2_中文版

文章作者:Tyan 博客:noahsnail.com Item 2:当面临很多构造函数参数时,要考虑使用构建器** 静态工厂和构造函数有一个共同的限制:对于大量可选参数它们都不能很好的扩展。...只有六个参数可能还不是那么糟糕,但随着参数数目的增长它很快就会失控。 简而言之,重叠构造函数模式有作用,但是当有许多参数时很难编写客户端代码,更难的是阅读代码。...它不直接构建需要的对象,客户端调用具有所有参数的构造函数(或静态工厂),得到一个构造器对象。然后客户端在构建器上调用类似于setter的方法来设置每个感兴趣的可选参数。...如果你开始使用构造函数或静态工厂,当类发展到参数数目开始失控的情况下,才增加一个构建器,废弃的构造函数或静态工厂就像一个疼痛的拇指,最好是在开始就使用构建器。...总之,当设计的类的构造函数或静态工厂有许多参数时,构建器模式是一个很好的选择,尤其是大多数参数是可选参数的情况下。

26720

Java IAQ:很少被回答的问题

并且,如果你使用的是JIT类的编译器,那么生成代码也会产生一些额外的字节。 在Sun 的JDK VM中,你也许会感到很吃惊,一个Object会占用16字节,或是4字大小。...大多数情况都会调用无参数构造函数,除非程序员在构造函数最开始的时候显式地写下了super(…)。 2、一旦父类的构造函数返回了,接下来实例变量初始化器和对象初始化器会按照文字顺序(从左到右)执行。...我推荐的是使用实例变量初始化器,这样一来,如果这个变量的值与所用的构造函数无关,则可以不必为每个构造函数都写一遍初始化代码了。...3、在默认的构造函数中利用非静态的初始化代码块对匿名子类进行初始化: new C() {{ a = 1; c = 3; e = 5; }} 赞成:十分简洁,没有使用setter那么凌乱;反对:实例变量不能是私有的...这些书对于初学者来说很危险,但是对其它语言稍有经验的编程人员是可以很容易认出并拒绝的。 非常好的。Java类的好书数量并不多。

62220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Effective Java】Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder

    参考链接: Java中的构造函数链接(带示例) 静态工厂和构造函数都有一个限制:可选参数数量很大时,他们都不能很好地扩展。...大多数产品只有少数几个可选字段是非零值。          你将为这种类编写怎样的构造函数或者静态工厂呢?...客户端并不直接构造需要的对象,而是先调用一个包含所有必选参数的构造函数(或静态工厂),得到一个builder object;然后,客户端在该builder object上调用类似setter的方法来设置各个感兴趣的可选参数...不过,要记住你在将来也许会想增加参数,如果你一开始就使用构造函数或静态工厂,那当参数数目失控时就得增加builder了,此时被废弃的构造函数或静态工厂就会像个怪物一样杵在那儿。...所以,通常最好一开始就使用builder。          总之,当所设计的类的构造函数或静态工厂拥有过多参数时,Builder模式是个不错的选择,尤其当大多数参数时可选的时候。

    47020

    Java 基础概念·Java 继承

    使用抽象类: 需要在几个相关的类中共享代码。 需要能控制继承来的成员的访问权限,而不是都为 public。 需要继承非静态和非常量字段。 在很多情况下,接口优先于抽象类。...super 访问父类的构造函数:可以使用 super() 函数访问父类的构造函数,从而委托父类完成一些初始化的工作。...应该注意到,子类一定会调用父类的构造函数来完成初始化工作,一般是调用父类的默认构造函数,如果子类需要调用父类其它构造函数,那么就可以使用 super 函数。...访问父类的成员:如果子类重写了父类的某个方法,可以通过使用 super 关键字来引用父类的方法实现。...每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。 最常用的地方就是构造器的重载。 方法的重载规则: 被重载的方法必须改变参数列表(参数个数或类型不一样)。

    51040

    Effective Java 2.0_中英文对照_Item 2

    静态工厂和构造函数有一个共同的限制:对于大量可选参数它们都不能很好的扩展。考虑这样一种情况:用一个类来表示包装食品上的营养成分标签。...通常构造函数调用需要许多你不想设置的参数,但无论如何你不得不为它们传值。在这种情况下,我们给fat传了一个零值。只有六个参数可能还不是那么糟糕,但随着参数数目的增长它很快就会失控。...它不直接构建需要的对象,客户端调用具有所有参数的构造函数(或静态工厂),得到一个构造器对象。然后客户端在构建器上调用类似于setter的方法来设置每个感兴趣的可选参数。...如果你开始使用构造函数或静态工厂,当类发展到参数数目开始失控的情况下,才增加一个构建器,废弃的构造函数或静态工厂就像一个疼痛的拇指,最好是在开始就使用构建器。...总之,当设计的类的构造函数或静态工厂有许多参数时,构建器模式是一个很好的选择,尤其是大多数参数是可选参数的情况下。

    33720

    并行设计模式--immutable模式

    ,比如上述JDK8的日期类,每一步修改操作都要产生一个中间对象,在很多情况下是可以利用享元模式来较少对象创建次数,事实上享元模式并没有要求所共享的实例一定是不可变的,只是在大多数情况不可变会使得享元模式更加简单纯粹...比如系统中有表示用户一次下单购买商品数量的类Quantity,那么考虑到用户一次性购买数量很少大于10,因此这个类设计成immutable并且应用享元模式就可以很好地提高性能。...其本身就是类似Integer类,因此设计的具体做法就非常类似Integer的实现(之所以在实现一遍,是为了更好的语义描述),对外提供两个创建入口,1是构造函数,构造函数直接创建出该类。...2是valueOf静态方法,该方法会先去缓存中查询是否包含,包含则直接返回。当然也可以在该类中加一些关于数量本身限制判断的业务方法。...与Builder模式配合中,对应的目标类往往只需要提供私有的构造函数,以及属性的get方法,构造过程则交给内部的Builder类来完成,这是一种对于过多参数或者构造之后很少变动的类所采取的一种比较好的方式

    90360

    代码整洁之道内容概要

    函数参数 最理想的函数参数的数量是零个,其次是一,再次是二,应尽量避免三。有足够的理由才能用上三个以上的参数。 如果函数看来需要两个,三个或者三个以上参数,就说明其中一些参数应该封装为类了。...如果你代码写的足够好的话,可以让人一看就懂,那么你就不需要再写注释。如果你的代码需要注释,那么你就需要想想是不是你的表达水平有问题。 2....13.2 限制数据作用域 两个线程修改共享对象的同一字段时,可能相互干扰,导致未预期的行为。解决方案之一是采用 synchronized 关键字在代码中保护一块使用共享对象的临界区。...限制临界区的数量很重要。更新共享数据的地方越多,就越可能出错。 建议:谨记数据封装,严格限制对可能被共享的数据的访问。 13.3 使用数据副本 避免共享数据的好方法之一就是一开始就避免共享数据。...那么学习这些基础问题的解决算法可以帮助你解决大多数的并发问题,因为大多的并发问题都是上述问题的变种。 13.6 警惕同步方法之间的依赖 同步方法之间的依赖会导致并发代码中的狡猾缺陷。

    36320

    设计规则

    设计规则支持遵从 .NET Framework 设计准则。 本节内容 规则 描述 CA1000:不要在泛型类型中声明静态成员 调用泛型类型的静态成员时,必须指定该类型的类型参数。...CA1012:抽象类型不应具有构造函数 抽象类型的构造函数只能由派生类型调用。 由于公共构造函数用于创建类型的实例,但无法为抽象类型创建实例,因此具有公共构造函数的抽象类在设计上是错误的。...而且,如果没有读访问,将无法查看共享对象的状态,使其用处受到限制。...应使用 sealed 修饰符标记不希望被继承的类型,以免将其用作基类型。 CA1053:静态容器类型不应具有构造函数 公共或嵌套公共类型只声明了静态成员,但具有公共或受保护的默认构造函数。...由于调用静态成员不需要类型的示例,因此没必要使用构造函数。 为安全起见,字符串重载应使用字符串自变量调用统一资源标识符 (URI) 重载。

    2K20

    【笔记】C++面向对象高级编程

    而且还有面向对象和基于对象的区别, 面向对象面对多重classes的交互设计, 基于对象之面对单一class的设计 C++才有重载 类相关 函数如果在类体中定义, 那么就会自动成为inline候选 构造函数后面的变量构造部分称为初始化列...首先要判断是否会出现自我赋值, 然后先delete自己的指针, 再深拷贝对方的指针: 如果不检测自我赋值的话, delete自己指针的时候有可能把对方指针内容也删掉, 很危险 系统堆栈 直接初始化的都是栈对象..., 不赋初值时静态成员为0 借助new(malloc)初始化的是堆对象, 生命直到delete才会结束, 如果指针作用域时还没有被delete, 那么就会发生内存泄漏....委托, 利用指针实现, 功能来自类内一个指向另一个类的指针 构造的时候都是从小到大(从父类到子类), 析构则相反, 内存分配也是大套小的 设计模式 普通单例: 静态成员在类内, 只要一写出这个类就会构造...这个过程需要多出好多步的寄存器计算, 因此动态绑定运行起来比静态绑定慢 之所以要用指针来进行多态本质是因为我们无法管理大小不一的容器, 但是管理指针很方便 每当调用一个对象的函数时, 编译器会隐式传入一个

    91530

    Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程二十一

    如果有多个构造函数并且只有一个用 注释@PersistenceConstructor,则使用它。 如果存在无参数构造函数,则使用它。其他构造函数将被忽略。...要使域类有资格进行此类优化,它需要遵守一组约束: 它不能是私人课程 它不能是非静态内部类 它不能是 CGLib 代理类 Spring Data 使用的构造函数不能是私有的 如果这些条件中的任何一个匹配,...如果属性是不可变的,我们将使用持久性操作(请参阅对象创建)使用的构造函数来创建实例的副本。 默认情况下,我们直接设置字段值。...如果您需要这些,最好将它们打包保护,以便它们只能由有限数量的并置类型调用。仅构造函数实现比属性填充快 30%。...这是一种既定的模式,而不是使用静态工厂方法来公开 all-args 构造函数的这些变体。

    95830

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    但注意了,看看IL代码结构,一行代码(定义字段+赋值)被拆成了两块,最终的赋值都在构造函数里执行的。 ?...那么问题来了,如果有多个构造函数,就像下面这样,有多半个构造函数,会造成在两个构造函数.ctor中重复产生对字段赋值的IL代码,这就造成了不必要的代码膨胀。...这个其实也很好解决,在非默认构造函数后加一个“:this()”就OK了,或者显示的在构造函数里初始化字段。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6....因为闭包中的共享变量i会被提升为委托对象的公共字段,生命周期延长了 8. C#中的委托是什么?事件是不是一种委托? 什么是委托?

    1K20

    当构造方法参数过多时使用builder模式

    静态工厂和构造方法都有一个限制:它们不能很好地扩展到很多可选参数的情景。请考虑一个代表包装食品上的营养成分标签的例子。...传统上,程序员使用了可伸缩(telescoping constructor)构造方法模式,在这种模式中,只提供了一个只所需参数的构造函数,另一个只有一个可选参数,第三个有两个可选参数,等等,最终在构造函数中包含所有可选参数...「只有」六个参数可能看起来并不那么糟糕,但随着参数数量的增加,它会很快失控。   简而言之,可伸缩构造方法模式是有效的,但是当有很多参数时,很难编写客户端代码,而且很难读懂它。...但是,如果从构造方法或静态工厂开始,并切换到 builder,当类演化到参数数量失控的时候,过时的构造方法或静态工厂就会面临尴尬的处境。因此,所以,最好从一开始就创建一个 builder。   ...总而言之,当设计类的构造方法或静态工厂的参数超过几个时,Builder 模式是一个不错的选择,特别是如果许多参数是可选的或相同类型的。

    97730

    框架设计原则和规范(二)

    构造函数应该是protected或者private的 1.4.2. 至少定义一个该抽象类的具体实现类型 要通过实际使用验证抽象类设计的问题 1.5. 静态类设计 1.5.1....结构的设计 1.7.1. 不要提供默认构造函数 1.7.2. 不要定义可变的值类型 1.7.3. 确保所有字段都是0、false、null时结构任然是有效状态 1.7.4....考虑用静态工厂方法代替构造函数,如果无法让想要执行的操作的语义与新实例的构造函数直接对应,或者遵循构造函数的设计规范让问觉得感觉不合理 2.3.3....要把构造函数的参数列表当作设置主要属性的快捷方式 2.3.4. 要用相同的名字来命名构造函数的参数和属性,如果定义该构造函数参数的目的就是为了设置对应的属性。...考虑以内联的形式来初始化静态字段,而不要显式的定义静态构造函数 运行库能对没有显式定义静态构造函数的类型进行性能优化 //不能优化的代码 public class Foo {

    1.4K50

    你真的了解AsyncTask?

    AsyncTask内部也使用了线程池处理并发;线程池通过ThreadPoolExector类构造,这个构造函数参数比较多,它允许开发者对线程池进行定制,我们先看看这每个参数是什么意思,然后看看Android...这个线程池是一个静态变量;那么在同一个进程之内,所有地方使用到的AsyncTask默认构造函数构造出来的AsyncTask都使用的是同一个线程池,如果App模块比较多并且不加控制的话,很容易满足第一条的崩溃条件...;如果你不幸在不同的AsyncTask的doInBackgroud里面访问了共享资源,那么就会发生各种并发编程问题。...Looper;如果去看API 22以下的代码,会发现它没有这个构造函数,而是使用默认的;默认情况下,Handler会使用当前线程的Looper,如果你的AsyncTask是在子线程创建的,那么很不幸,你的...,因此在一个进程内,所有的AsyncTask都是并行执行的;但是在Android 3.0以后,如果你使用execute函数直接执行AsyncTask,那么这些任务是串行执行的;(你说蛋疼不)源代码如下:

    46620

    .NET面试题解析(05)-常量、字段、属性、特性与委托

    但注意了,看看IL代码结构,一行代码(定义字段+赋值)被拆成了两块,最终的赋值都在构造函数里执行的。 ?...那么问题来了,如果有多个构造函数,就像下面这样,有多半个构造函数,会造成在两个构造函数.ctor中重复产生对字段赋值的IL代码,这就造成了不必要的代码膨胀。...这个其实也很好解决,在非默认构造函数后加一个“:this()”就OK了,或者显示的在构造函数里初始化字段。...静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。 5. 自动属性有什么风险? 因为自动属性的私有字段是由编译器命名的,后期不宜随意修改,比如在序列化中会导致字段值丢失。 6....因为闭包中的共享变量i会被提升为委托对象的公共字段,生命周期延长了 8. C#中的委托是什么?事件是不是一种委托? 什么是委托?

    83610

    Effective Java要点笔记

    (如专门的工厂类) 可根据Type入参来从工厂拿对应多例 多个构造参数,如果灵活多变,要考虑用构造器 工作中如果构造函数有多个 且 特定 的话,我一般倾向写两三个函数签名不一样构造器。...如果构造类时需要多个参数,特别是当大多数参数都是可选的时候,Builder 不失为一个很好的选择。可读性和安全性都能保障。..., 策略抽象成接口,如果实现接口的具体策略只使用一次,用匿名类,否则应该定义一个静态final函数, 返回类型为策略接口 public static 静态成员类的实例被创建的是时候,它和外围实例之间的关联关系也随之建立起来&不能被修改 每当编写方法和构造器的时候,应该考虑他它的参数有哪些限制,应该把限制写到文档中,并在方法的开头处加上限制逻辑,私有方法...assert断言 我们要保护性的去设计程序,如果API设计的不好,客户端很容易误解,并导致不可预期的行为,所以编写面对客户的不良行为时仍能保持健壮的类,这是非常值得投入时间去做的事情。

    44210

    Spring认证中国教育管理中心-Spring Data R2DBC框架教程五

    如果有多个构造函数并且只有一个用 注释@PersistenceConstructor,则使用它。 如果存在无参数构造函数,则使用它。其他构造函数将被忽略。...如果属性是不可变的,我们将使用持久性操作(请参阅对象创建)使用的构造函数来创建实例的副本。 默认情况下,我们直接设置字段值。...使用所示设计,数据库值将胜过默认值,因为 Spring Data 使用唯一声明的构造函数。...如果您需要这些,最好将它们打包保护,以便它们只能由有限数量的并置类型调用。仅构造函数实现比属性填充快 30%。...这是一种既定的模式,而不是使用静态工厂方法来公开 all-args 构造函数的这些变体。

    1.1K10

    深入理解Android系统资源异常之文件描述符异常篇

    当读、写一个文件时,使用open/create返回的文件描述符来标识该文件,将其作为参数传递给read或write。...系统中对每个进程可以打开最大fd数量的限制,可以通过命令ulimit -n查询。 也可以加上-S标识软限制,-H标识硬限制。...我这里分别查询了手机系统和服务器系统上的数值,手机系统上为 32768;服务器系统上为 20480000。 那么,手机上的这个fd最大限制数值是怎么来的呢?...对于少部分需要打开更多文件的进程,当打开文件数量超过了静态数组的阈值后,会动态分配fdtab数组来进行扩展。...,放到该结构体里,可以实现每进程细粒度控制; entries数组,静态数组,大小由模板特化的时候参数传入,对于大多数进程来说,需要打开文件数量有限,静态数组就可以满足存储需求; overflow,动态数组

    2.9K10

    《Effective Java 》系列一

    如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就始终不错的选择。...不应该以来中介方法来更新重要的持久状态。例如依赖和总结方法来释放共享资源上的永久锁,很容易让整个分布式系统垮掉。 使用中介方法有一个非常严重的性能损失。...如果当前正在编写的类,他的安全性依赖于BigInteger的非可变性,那么你必须检查 一确定这个参数是不是一个真正的BigInteger,而不是一个不可新的子类实例。...超类的构造函数将会在子类的构造函数运行之前先被调用,如果该改写版本的方法依赖于子类构造函数所执行的初始化工作,那么该方法将不会如预期般的执行。...如果你在内部同步了类,就可以使用不同的方法来实现高并发性,例如分拆锁、分离锁和非阻塞并发控制。 如果方法修改了静态域,那么你也必须同步对这个域的访问,即使他往往之用于单个线程。

    85040

    腾讯2014校园招聘软件开发类笔试试题

    socket进程通信与网络通信使用的是统一套接口,只是地址结构与某些参数不同。     答案:ABCD 8 静态变量通常存储在进程哪个区?...如果是,则可以建立复合索引;否则考虑单字段索引;    如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;    如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段...再仔细看一下题目(说实话,我很讨厌这种文字游戏),“这个函数一定...“,所以,问题集中在,是否是一定会使用这两种方式呢?     显然不是的。...可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。 可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。...Flyweight享元模式 运用共享技术有效的支持大量细粒度的对象 主要是解决由于相同对象数量过大而造成系统内存开销过大的问题。实际上是相同的对象引用指向同一个对象空间。

    75320
    领券