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

String类不可变分析以及普通不可变类

一、String为什么不可变? 要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。 final关键字可以修饰类、方法、字段。...修饰类时,这个类不可以被继承; 修饰方法时,这个方法就不可以被覆盖(重写),在JVM中也就只有一个版本的方法--实方法; 修饰字段时,这个字段就是一个常量。...五、不可变类 不可变类只是它的实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例时就提供,并在对象 的整个生命周期内固定不变。...如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。 六、不可变类的优点和缺点 不可变类实例不可变性,具有很多优点。 ①不可变类对象比较简单。...总之,使类的可变性最小化。不要为每个get方法编写一个相对应的set方法,除非有很好的理由要让类成为可变的类,否则就应该是不可变的。如果有些类不能被做成是不可变的,仍然应该尽可能地限制它的可变性。

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

    不可变类特征

    不可变类:实例不能被修改的类。 每个实例中包含的所有信息都必须在创建该实例时提供,且在对象的整个生命周期内固定不变。...不可变类,如:String、基本类型的爆装备、BigInteger和BigDecimal。 为了使类成为不可变,要遵循以下五条原则: 不要提供任何会修改对象状态的方法(set方法)。 保证不会被扩展。...(防止子类化,可使用fianl修饰类) 声明所有的域都是final的。 声明所有的域都为私有的。 确保对任何可变组件的互斥访问。 不可变类的优点: 不可变对象简单,只有在创建时的一种状态。...不可变对象创建后无需考虑额外的维护工作。 不可变对象本质上是线程安全的,他们不要求同步。 不可变对象可以被自由的共享其本身和内部信息。...因不可变对象的这些特性,对于频繁用到的值,尽可能的重复使用现有实例。

    42510

    Java不可变类机制

    参考链接: Java 如何创建不可变类 不可变类(Immutable Class):所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。...可变类(Mutable Class):相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。  不可变类的特性对JAVA来说带来怎样的好处? ...5)类应该是final的,保证类不被继承,如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 ...value字段 Field valueFieldOfString = String.class.getDeclaredField("value"); valueFieldOfString.setAccessible...String的不可变特性主要为了满足常量池、线程安全、类加载的需求。合理使用不可变类可以带来极大的好处。

    95920

    Python import可变路径的类

    问题是酱紫的,他们组老大想让他用python处理一些json方面的问题,其中一个类A要调用另外一个类B的与json处理有关的函数,但是这个类B居无定所,没有一个固定的地方,他就不知道怎么把这个类B import...实际上方法很简单,老哥的python脚本是在linux的terminal用vim编辑器来写的,只要在import处加上一个获取输入参数的功能每次执行时将可变路径类B的路径输入进去就可以调用了,下面解决方案的截图...变量importPath来接收B类的路径,然后将这个路径使用sys.path.append(importPath) 添加到下面的类的import前面,其效果就是把import B变成了import importPath.B...这样一来就不用担心B类路径变化的问题。 下面是执行方法,我的脚本原来就有三个参数,现在新增加了一个参数,执行的时候将类B的路径放在第一个位置即可。 ?...实际上问题还是很好处理的,只是老哥半天没解释清楚,说什么把类B当成文件,如何去解析类B,找到里面的json方法,把我捉急的,所以这则故事告诉我们沟通的重要性。

    92710

    面试题之  什么是不可变类? 为什么String是不可变类? 如何创建一个不可变类

    面试题: 什么是不可变类? 为什么String是不可变类?...如何创建一个不可变类 不可变类 当类的对象创建后,它的值就不可以再更改了 相比于可变对象,不可变对象有很多优势 不可变对象可以提高String Pool(字符串常量池)的效率和安全性。...从String类不可变的好处进行分析 ---- 只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。...---- 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。...如何创建一个不可变类 将类声明为final,所以它不能被继承 将所有的成员声明为私有的,这样就不允许直接访问这些成员 对变量不要提供setter方法 将所有可变的成员声明为final,这样只能对它们赋值一次

    35710

    String类的不可变性

    来源 | 简书| 作者 | 指尖上的榴莲 一.原理(为什么说String类是不可变的) 1.什么是不可变对象 如果一个对象在创建之后就不能再改变它的状态,那么这个对象是不可变的(Immutable)。...要理解String类的不可变性,首先看一下String类中都有哪些成员变量。...通过查看String类源码可以发现,String类不可变,关键是因为SUN公司的工程师,在后面所有String的方法里都很小心的没有去动字符数组里的元素。...所以String类不可变的关键都在底层的实现,而不仅仅是一个final。...3.允许String对象缓存hashcode 查看上文JDK1.8中String类源码,可以发现其中有一个字段hash,String类的不可变性保证了hashcode的唯一性,所以可以用hash字段对String

    60130

    Java-不可变类的实现

    一、不可变类简介 不可变类: 所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。...可变类: 相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?...易于构造、使用和测试 … 三、不可变类的设计方法 对于设计不可变类,个人总结出以下原则: 1. 类添加final修饰符,保证类不被继承。...如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 2....value字段 Field valueFieldOfString = String.class.getDeclaredField("value"); //改变value属性的访问权限 valueFieldOfString.setAccessible

    1.3K10

    JAVA不可变类(immutable)机制与String的不可变性

    一、不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。...可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。 二、不可变类的优点 说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?...三、不可变类的设计方法 对于设计不可变类,个人总结出以下原则: 1. 类添加final修饰符,保证类不被继承。...如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。 2....value字段 Field valueFieldOfString = String.class.getDeclaredField("value"); //改变value属性的访问权限

    1.7K20

    Jackson反序列化不可变类

    Jackson默认的反序列化策略需要无参构造器,并提供字段setter函数。如下ImmutableUser类属性都被final修饰,只有全参构造器,没有setter方法,它的实例一经创建就不可变。...需注意,@JsonProperty的value必须填写,且最好与Json串中字段名一致。否则将导致下面的异常。...Injectable): can not use as property-based Creator 二 使用jackson-module-parameter-names如果ImmutableUser类来自...由官方维护的jackson-module-parameter-namesModule,正好可以实现无侵入的反序列化不可变类。...我们反序列化第三方的不可变类时,可以使用该机制:创建ImmutableUserMixin类,具有与ImmutableUser相似的构造器参数,使用 @JsonProperty声明了参数对应的json字段

    9810

    【译】ES提案:公有类字段

    原文链接https://2ality.com/2019/07/public-class-fields.html 这篇博客是关于类定义中新成员的系列文章中的一部分: 公有类字段 私有类字段 私有方法和JavaScript...类的getter/setter方法 这个系列取代了2ality’s prior blog post on fields ---- 在这篇文章中,我们将探讨公有类字段,一般用来创建实例熟悉和静态属性。...此功能是Daniel Ehrenberg和Jeff Morrison的ES提案“JavaScript的类字段声明”的一部分。 概览 1.1....它的值是字符形式,同时包含其他特性如writable——定义属性的值是否可变。...可用性 类字段当前可以应用在: Babel 7.0+。在这个特性进入到stage 4之前,都必须通过插件@babel/plugin-proposal-class-properties来启用。

    84120

    如何在java中创建不可变类?

    原文【如何在java中创建不可变类?】地址 今天我们将学习如何在java中创建不变的类。不可变对象是在初始化之后状态不变的实例。例如,String是一个不可变类,一旦实例化,它的值不会改变。...不可改变的类对于缓存的目的是有益的,因为你不需要担心价值的变化。不可变类的其他好处是它本质上是线程安全的,所以在多线程环境的情况下,您不需要担心线程安全。...在这里,我提供了一种通过一个例子来创建Java中不可变类的方法,以便更好地理解。 要在java中创建不可变类,您必须执行以下步骤。 将类声明为final,因此无法扩展。...使所有字段都是私有的,以便不允许直接访问。 不要为变量提供setter方法 使所有可变字段都是最终的,以便它的值只能被分配一次。 通过执行深层拷贝的构造函数初始化所有字段。...进一步阅读:如果不可变类有很多属性,其中一些属性是可选的,我们可以使用构建器模式来创建不可变类

    1.9K50

    Django 2.1.7 模型类 - 字段类型

    本篇章开始将继续看看模型类还可以设置哪些字段类型 参考文献 https://docs.djangoproject.com/zh-hans/2.1/ref/models/fields/ 前面篇章设置好的两个模型类...models.CharField(max_length=20, default=None) server_shelves_date = models.DateField(auto_now_add=True) # 中间件类:...models.IntegerField() server = models.ForeignKey('ServerInfo',on_delete=models.CASCADE, default=None) 对于模型类的字段类型...定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下: 属性=models.字段类型(选项) 字段类型 使用时需要引入django.db.models包,字段类型如下: AutoField:...编写模型类演示 有了上面关于字段类型的相关说明,下面来丰富一下我这边编写的模型类字段属性,如下: class ServerInfo(models.Model): server_hostname

    1.7K30

    聊聊JAVA中 String类为什么不可变

    前世今生 String不可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...回到代码本来来说,因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时...不可变的好处 首先,我们应该站在设计者的角度思考问题,而不是觉得这不好,那不合理: 可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。...当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝出里面的值,性能会有一定的损失。...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

    40510

    聊聊JAVA中 String类为什么不可变

    前世今生 String不可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...回到代码本来来说,因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一个共享池中,当第二次再次生成同样内容的字符串实例时...不可变的好处 首先,我们应该站在设计者的角度思考问题,而不是觉得这不好,那不合理: 可以实现多个变量引用堆内存中的同一个字符串实例,避免创建的开销。...当我们在传参的时候,使用不可变类不需要去考虑谁可能会修改其内部的值,如果使用可变类的话,可能需要每次记得重新拷贝出里面的值,性能会有一定的损失。...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

    779190

    事与愿违:可变类出现了线程安全问题

    本章难度:★★☆☆☆ 本章重点:理解可变类引发线程安全问题的原因,重点理解什么是可变类,以及可变类在多线程环境下存在的问题,能够结合自身实际项目思考哪些场景下可变类会引发线程安全问题,并能够思考问题背后的解决方案...在实现上,我想的比较简单,就是通过一个名字和身份证编号来定义一个不可变类,表示一个用户,由这个不可变类支持线程安全。...,你知道什么是不可变类吗?”...“对,概念记得倒是挺清楚的,但是这个User类不是一个不可变类呀,我们根据不可变类的定义分析下这个User类为什么不是一个不可变类”,老王巴拉巴拉的说了起来。...idCard的值,这个过程并不是原子操作,线程1在执行set()方法时,在更新完name字段的值时,如果此时恰好发生了线程切换,线程2获取用户信息时,获取到的用户的name字段为张三,idCard字段为

    20020
    领券