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

如果大多数构造函数参数都是共享的,那么使用静态字段来限制构造函数参数的数量是不是很糟糕的设计?

使用静态字段来限制构造函数参数的数量并不一定是糟糕的设计,它可以根据具体情况来决定是否适用。以下是对这个问题的详细解答:

在面向对象编程中,构造函数用于创建对象并初始化其状态。构造函数的参数通常用于传递对象的初始值,以便在创建对象时进行设置。如果大多数构造函数参数都是共享的,即多个对象的构造函数需要相同的参数值,那么使用静态字段来限制构造函数参数的数量可以简化代码并提高可维护性。

使用静态字段的方式可以将共享的参数值存储在类的静态字段中,这样所有对象的构造函数都可以直接使用这些共享的参数值,而无需在每个对象的构造函数中重复传递相同的参数。这种设计可以减少代码冗余,提高代码的可读性和可维护性。

然而,需要注意的是,使用静态字段来限制构造函数参数的数量也可能引入一些问题。首先,静态字段是全局共享的,可能会导致并发访问的问题,需要考虑线程安全性。其次,如果某个对象需要不同的参数值,那么使用静态字段的方式就无法满足其需求,可能需要重新设计或者使用其他方式来处理。

总结来说,使用静态字段来限制构造函数参数的数量可以简化代码并提高可维护性,但需要根据具体情况来决定是否适用。在设计时需要考虑并发访问和个别对象的特殊需求,并进行权衡取舍。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 腾讯云人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 腾讯云物联网平台(IoT Hub):https://cloud.tencent.com/product/iothub
  • 腾讯云移动开发平台(MPS):https://cloud.tencent.com/product/mps
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙服务(Tencent Cloud Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective Java 2.0_Item 2_中文版

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

25420

Java IAQ:很少被回答问题

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

60920

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

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

45420

Java 基础概念·Java 继承

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

48640

Effective Java 2.0_中英文对照_Item 2

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

32420

并行设计模式--immutable模式

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

88360

设计规则

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

2K20

代码整洁之道内容概要

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

33620

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

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

90130

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

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

92730

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

构造函数应该是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模块比较多并且不加控制的话,容易满足第一条崩溃条件...;如果你不幸在不同AsyncTaskdoInBackgroud里面访问了共享资源,那么就会发生各种并发编程问题。...Looper;如果去看API 22以下代码,会发现它没有这个构造函数,而是使用默认;默认情况下,Handler会使用当前线程Looper,如果AsyncTask是在子线程创建那么很不幸,你...,因此在一个进程内,所有的AsyncTask都是并行执行;但是在Android 3.0以后,如果使用execute函数直接执行AsyncTask,那么这些任务是串行执行;(你说蛋疼不)源代码如下:

45320

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

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

1K20

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

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

1.1K10

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

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

82310

Effective Java要点笔记

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

42410

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

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

94930

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

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

2.3K10

为什么android API 中有很多对象创建都是使用new关键字

当然,它适用场景是存在多个构造函数如果你只有一个构造函数,且希望被继承,则完全可以使用new创建对象。...相反地,如果你在设计时候考虑到,既不需要缓存,也不可能成为单例,那么你同样可以,以直接new方式创建对象。...上面提到都是使用静态工厂方法”相较于其他(创建对象方式)优势,那么我们再来看看它有什么限制。...如果这种情况下依然坚持使用构造函数或者静态工厂方法,那么要编写很多重叠构造函数,而且对于那么可选域而言,这些重叠函数简直就是噩梦! 避免代码难写,难看,难以阅读,有两种办法可以解决。...其实看完这些总结和经验,我想你心里一定有明确答案了,那就让我们再来一句总结: 如果类足够简单,那么完全可以使用new直接创建!切记过犹不及API设计

71230

《Effective Java 》系列一

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

82340
领券