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

这是在构造函数内部是安全的,还是应该移到其他地方

在构造函数内部是安全的,因为构造函数是在对象实例化时被调用的,它的主要目的是初始化对象的成员变量和执行一些必要的操作。在构造函数内部进行一些安全性检查和初始化工作是非常常见的做法,这样可以确保对象在被创建时处于一个合理的状态。

将安全性检查和初始化工作移到其他地方可能会导致一些问题。首先,如果将这些操作移到其他方法中,那么在使用对象之前就必须确保这些方法被调用,否则对象可能处于一个不完整或不合法的状态。这增加了使用对象的复杂性和错误的可能性。

其次,将安全性检查和初始化工作移到其他地方可能会导致并发访问的问题。如果多个线程同时访问对象,并且在对象实例化后才执行安全性检查和初始化工作,那么可能会出现竞态条件和数据不一致的问题。在构造函数内部进行这些操作可以避免并发访问的问题,因为构造函数在对象实例化时只能被一个线程调用。

总结起来,将安全性检查和初始化工作放在构造函数内部是一种安全和可靠的做法,它可以确保对象在被创建时处于一个合理的状态,并且避免了并发访问的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通俗易懂设计模式解析——单例模式

在第一次调用的时候会创建一个instance。这个实现也有一定的安全隐患。...instance被创建的时机不明,任何对Singleton的调用都会提前创建instance static构造函数的循环调用。...如有A,B两个类,A的静态构造函数中调用了B,而B的静态构造函数中又调用了A,这两个就会形成一个循环调用,严重的会导致程序崩溃。...延迟初始化是我们在写程序时经常会遇到的情形,例如创建某一对象时需要花费很大的开销,而这一对象在系统的运行过程中不一定会用到,这时就可以使用延迟初始化,在第一次使用该对象时再对其进行初始化,如果没有用到则不需要进行初始化...四、总结   在设计模式的学习过程中,单例模式较为简单,实现操作并不是特别难,但是在我们实例运用中也当注意下,比较如果使用出现问题。找到问题还是稍微困难的。

58930

【设计模式】各个击破单例模式的8种写法

单例模式 在一个系统开发过程中,我们在基于节省内存资源、保证数据内容的一致性的考虑上,往往需要对某些类要求只能创建一个实例,即「保证类只有一个实例」的设计模式就是单例模式。...那就在线程安全的基础上减少锁住的代码数量,「这里有坑」 /** * lazy loading 懒汉式 * 在加锁的基础上再优化一下,减少加锁代码块的数量 * @author 行百里er */ public...说明这种写法看似在线程安全有减少了锁的代码量,其实是达不到“永远”单例的目的的。...答案是肯定的。 「volatile」的作用是「保证线程可见性和禁止指令重排序」。在DCL单利模式写法中,volatile主要是用于禁止指令重排序的。...这是Java创始人之一的大神在《Effective Java》这本书中推荐的写法。 小结 虽然单例模式有这么多种写法,但不少是炫技式的花活,有点像孔乙己的“茴”字的N中写法。

29720
  • 【C++】简易了解内部类,匿名对象和对象拷贝时的编译器优化

    内部类: C++内部类是指在一个类的内部定义另一个类。内部类可以访问外部类的私有成员,并且可以用外部类的对象创建内部类的对象。内部类的声明和定义通常在外部类的声明中,但也可以在外部类的定义中进行。...内部类的特性: 如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。...内部类默认是外部类的友元类。...内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了...return n; } }; int main() { A aa1; // 不能这么定义对象,因为编译器⽆法识别下⾯是⼀个函数声明,还是对象定义 //A aa1(); // 但是我们可以这么定义匿名对象

    6710

    JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK16特性讲解】

    作为对反馈的回应,JEP 384对该设计进行了改进, 并在JDK 15 中作为第二次预览功能交付 。第二次预览的改进如下: 在第一个预览版中,规范构造函数必须是 public....在第二个预览中,如果隐式声明了规范构造函数,则其访问修饰符与记录类相同;如果显式声明了规范构造函数,则其访问修饰符必须提供至少与记录类一样多的访问权限。...@Override注释的含义被扩展为包括注释方法是记录组件的显式声明的访问器方法的情况。 为了强制使用紧凑构造函数,分配给构造函数主体中的任何实例字段会导致编译时错误。...一些最严重的违规者是那些只不过是少数值的不可变 数据载体的类。正确编写这样的数据载体类涉及许多低价值、重复、容易出错的代码:构造函数、访问器 equals、hashCode、toString、 等。...总之,在访问外部内存时,开发人员面临着两难选择:他们应该选择安全但有限(并且可能效率较低)的路径,例如 ByteBufferAPI,还是应该放弃安全保证并接受危险且不受支持的路径?

    1.7K50

    Java 17 与 Java 11:为什么我强烈建议你升级到 Java 17?

    如果您的应用程序依赖于 Spring 框架,您应该绝对考虑迁移到 Java 17。...这里的yield是一个上下文相关的关键字,即你可以在函数内的其他地方使用变量名yield 。 'Records'类型 Records类是一种特殊的不可变类,旨在取代数据传输对象(DTO)。...Records中的字段不能更改,只能通过声明记录时给出的参数来定义,如上所示(但我们可以定义静态变量)。我们还可以定义一个可以验证字段的自定义构造函数。...具有多个构造函数以及静态变量和方法的Records示例如下所示: public record Employee(int id, String firstName,...因此,如果我们在项目中使用外部库,我们应该非常小心。通过了解这些潜在问题并采取必要的步骤来解决它们,您可以确保顺利成功地迁移到 Java 17。

    3.4K30

    Java-安全发布

    ---- 二、 不安全的发布  因为对象一般是在构造函数里面初始化的(不讨论反射),当构造一个对象时,会为这个对象的属性赋值,当前时刻对象各个属性拥有的值称为对象的状态。...同时,也引出了一个重要问题,我们是在哪些地方用到这个对象呢?比如:只在一个线程里面访问这个对象,还是有可能多个线程并发访问该对象?然而在Demo-3代码段中显然没有考虑多线程的安全性问题。  ...3.1安全发布的常用模式 在静态初始化函数中初始化一个对象的引用; 将对象的引用保存到volatile类型的域或者AtomicReference对象中; 将对象的引用保存到某个正确构造对象的final类型域中...3.2在静态初始化函数中初始化一个对象的引用 通常,要发布一个静态构造的对象,最简单和最安全的方式是使用静态的初始化器。...这是由于JVM的一个特性:静态初始化器由JVM在类的初始化阶段执行,JVM依靠其自身的同步机制,可以使初始化的任何对象都可以被安全地发布。

    74720

    最强总结 | 带你快速搞定kotlin开发(中篇)

    主构造器是类头部的一部分, 位于类名称(以及可选的类型参数)之后,并且有一点与Java不同,就是在主构造器中我们可以直接声明成员属性。...lambda表达式,在kotlin中,如果函数的最后一个参数是lambda表达式,可以直接移到外面来: users.forEach(){ person: User -> if (...我想了下,使用的场景可能就是你的一个函数里想再抽出一个函数,但这个函数只有你这个外部函数会调用,不想被类中的其他地方调用,这个时候你就可以抽成一个局部函数。...需要注意的是,这种嵌套的方式每次在外部函数被调用的时候会生成一个额外的对象,所以如果调用比较平凡的函数还是不要在里面嵌套内部函数。...扩展 这是我个人很喜欢的特性,kotlin中我们可以向任意类扩展函数或者属性,比如我觉得MutableList应该具备可以任意交换数据的函数,那我们就可以自己为MutableList类扩展一个这样的函数

    70120

    TypeScript4有些啥?

    就算现在没在写什么复杂的高阶函数, 改进类型也仍然能让我们在之后的能够更细节地去描述类型, 正确提示一些不明确的数组类型定义, 改进其他地方的类型提示....属性的类型只会在直接初始化的时候得到推断. 因此需要一个初始化函数, 或者直接对其进行定义. 在TypeScript4中, a的类型会被推断为number | boolean: 从构造函数自动推断....b 目前, 最后一个选项可能是最有用的, 除非正儿八经地在进行布尔运算, 那这个合并运算对于默认值和错误回落值是个很完美的解决方案....支持了React的新的JSX内部(译注: children之类的) 编辑器对@deprecatedJSDoc注解的支持 在3.9版本的性能提升后的性能提升 新的编辑器可用的代码重构(比如自动的用可选链Optional...至少它们帮着TypeScript的程序员们续命了 -- 改善了类型安全以及开发体验.

    94710

    ES6之class的继承

    class语法为我们提供了构造函数的语法糖,响应的,也给我们提供了ES5通过原型链实现继承提供了extends关键字实现继承。继承这个概念对面后台应该也是非常常见。...这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。...如果子类没有定义constructor方法,这个方法会被默认添加,需要注意的地方是,在子类的构造函数中,只有调用super之后,才可以使用this关键字,否则会报错。...当做函数的时候只能在子类的构造函数中使用,子类必须调用,也就是constructor里面,其他地方会报错: class User{} class Son extends User{ eat(){...子类静态方法super内部this指向当前子类,而不是实例或者原型对象,所以子类Son调用talk方法,输出的是30。 使用super必须指定是函数还是对象,否则报错。

    51210

    剑指Offer(一)--手写单例模式

    单例模式主要有懒汉式,饿汉式,枚举式,还有注册登记式,当然还有其他的,这里说的是我们经常知道的或者常用常见的几种。 我们都知道单例的目的是:为了让类只有一个实例在其他地方使用。...1.public修饰,直接访问的饿汉模式 第一种single是public,可以直接通过Singleton类名来访问 public class Singleton { //私有化构造方法,以防止外界使用该构造方法创建新的实例...,不会有线程安全问题,但是是有缺点的,因为instance的初始化是在类加载的时候就在进行的,所以类加载是由ClassLoader来实现的,那么初始化得比较早好处是后来直接可以用,坏处也就是浪费了资源,...静态内部类虽然保证了单例在多线程并发下的线程安全性,但是在遇到序列化对象时,默认的方式运行得到的结果就是多例的。...)对这个语句做的操作: 1.给instance分配了内存 2.调用Singleton的构造函数初始化了一个成员变量,产生了实例,放在另一处内存空间中 3.将instance对象指向分配的内存空间,执行完这一步才算真的完成了

    55920

    打造一套安全的UI组件库!

    第二个不安全的因素是组件内部的过度暴露导致的系统紊乱:组件内部的逻辑结构可以被外界轻易修改是一个安全隐患,这也是Web Component要解决的问题。...; 当然,所有安全都是相对的,在closed模式下挂载一个自定义的key来引用shadowRoot是一个稍微聪明点的实践,像下面这样在元素身上挂一个“_root”其他人应该猜不到(吧)。...由于这个uuid对于每个customElements是唯一的,放在构造函数身上不合适,因为原型函数也需要使用,挂在任何一个原型函数上也不合适,挂在元素自身更不合适,咋整呢?...闭包+Symbol:完美组合 我一直认为秒杀面试官的诀窍是能够用自己独特的理解来定义任何一个名词,比如我对js闭包的定义是:闭包是一个语法糖,在函数嵌套定义的语法环境下,父函数的环境对象(变量对象)会挂到子函数的作用域链上...但是根据之前的2个准则,组件本身没有这些操作的权限,只能用户来操作,这样不免有些繁琐,不如我们在组件的构造函数上封装一个这样能够快速生成对话框的工具类方法,提供一种快捷方式给用户可以开箱即用: await

    1.3K41

    Java多线程编程-(18)-等待通知模式接口Condition接口深入分析

    在使用synchronized作为同步的时候,可以使用任意的Java对象作为锁,这是因为任意的一个Java对象,都拥有一组监视器方法,这些监视器方法是定义在超类Object中的,主要包括:wait、notify...三、Condition接口实现原理 ConditionObject实现了Condition接口,是AQS的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类是一个比较合理的方式...上述节点引用更新的过程并没有使用到CAS保证,这是因为当前线程调用await() 方法的时候必定是获取了锁的线程,也就是说该过程是由锁来保证线程安全的。...我们知道在使用synchronized的时候,是使用的对象监视器模型的,即在Object的监视器模型上,一个对象拥有一个同步队列和等待队列,而Lock可以拥有一个同步队列和多个等待队列,这是因为通过lock.newCondition...节点从等待队列加入到同步队列的过程如下: ? 通过调用同步器的方法将等待队列中的头结点线程安全的移到同步队列的尾节点,当前线程在使用LockSupport唤醒该节点的线程。

    71910

    几种常见的Runtime Exception

    具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。...异常机制 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。...如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。...③ 异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。...应该声明方法抛出异常还是在方法中捕获异常?原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常。 再次抛出异常 ①为什么要再次抛出异常?

    1.2K20

    大话 JavaScript(Speaking JavaScript):第二十六章到第三十章

    保持变量声明局部 如果你的函数不太长(无论如何都不应该太长),那么你可以在提升方面放松一些,假装var声明是块作用域的。...在即将到来的 ECMAScript 6 中,类将是默认的继承构造。 对于构造函数,使用严格模式很重要,因为它可以防止你忘记实例化时使用new操作符。你应该知道你可以在构造函数中返回任何对象。...有关使用构造函数的更多提示,请参阅实现构造函数的提示。 避免使用闭包来处理私有数据 如果你希望对象的私有数据完全安全,你必须使用闭包。否则,你可以使用普通属性。...来自 ECMAScript 规范: [[Match]]内部属性的值是RegExp对象的模式的实现相关表示。 唯一没有内部属性的内置构造函数是Error和Object。...它纯粹与语言相关,无论是在 Node.js 上还是在浏览器上都是有意义的。 四种语言库 以下库已经相当成熟并且接近语言。

    16210

    CopyOnWrite你都不知道还怎么拿Offer

    CopyOnWriteArrayList 是一个并发容器。有很多人称它是线程安全的,我认为这句话不严谨,缺少一个前提条件,那就是非复合场景下操作它是线程安全的。...其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容 Copy 出去形成一个新的内容然后再改,这是一种延时懒惰策略。...Java 并发包提供了很多线程安全的集合,有了他们的存在,使得我们在多线程开发下,大大简化了多线程开发的难度,但是如果不知道其中的原理,可能会引发意想不到的问题,所以知道其中的原理还是很有必要的。...调用 iterator 方法获取迭代器,内部会调用 COWIterator 的构造方法,此构造方法有两个参数,第一个参数就是 array 数组,第二个参数是下标,就是 0。...snapshot 是“快照”的意思,如果 Java 基础尚可的话,应该知道数组是引用类型,传递的是指针,如果有其他地方修改了数组,这里应该马上就可以反应出来,那为什么又会是 snapshot这样的命名呢

    40820

    变量类型、构造器、封装以及 LeetCode 每日一题

    特殊的一点是,如果一个构造器的执行体完全包含另一个构造器的执行体,则可在方法 B 中调用 方法 A。...因此类的构造器通过用 public 修饰从而允许在其他地方创建该类的实例。因为外部类通常都希望被其他类自由使用,所以大部分外部类用 public 修饰。...示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。...说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。...也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。

    67920

    重构 — 代码的坏味道(二)

    中间人Middle Man 对象的基本特征之一就是封装-对外部世界隐藏其内部细节。封装往往伴随着委托。...纯数据类 Data Class 一种情况是,这真的是纯数据类,存放数据的容器,不会改变类的变量值。这种情况没有问题。 另一种情况是,类内有一些字段,以及访问这些字段的函数。...但是在很多其他地方频繁的对该类的字段进行访问修改。那么可以考虑,将这些频繁的行为搬移到类的内部。也就是说,把处理数据的行为从客户端搬移到纯数据类里来。 21....被拒绝的遗赠 Refused Bequest 指的是,子类只想继承超类的部分字段和函数,其他的拒绝使用。这意味着继承体系设计错误。超类中的字段函数应该是子类的必备数据。...继承体系设计时,应该是真是一个体系。而不应因为多个并行的类有某些行为相像的函数,而抽取超类。比如猪和牛都有四条腿和一个尾巴,但不应该抽取一个只有四条腿和一个尾巴的超类,猪牛不是一个体系的。 22.

    37420

    23天读懂23种设计模式:单例模式(创建型)

    建造者模式(Builder Pattern):把构造对象实例的逻辑移到了类的内部,在类的外部定义了该类的构造逻辑,强调的是产品的构造过程。...singleton == null){ singleton = new SingletonCase1(); } return singleton; } } 代码分析: 因此虽然在默认的构造函数上添加了私有属性...饿汉模式(线程安全) 饿汉式单例模式的特点是:类在加载时就直接初始化了实例。即使没用到,也会实例化,因此,它也是线程安全的单例模式。...) 懒汉式单例模式的特点:对比普通模式,给方法加了排它锁,这是线程安全的写法;对比饿汉模式,全局对象只会在用到时才会进行初始化。...下面 例子3 是懒汉模式: /** * 懒汉式,对比SingletonCase1,给方法加了排它锁,这是线程安全的写法。 * 用到这个实例时才去调用方法实例化。

    21210
    领券