一概念介绍
1 不可变类的意思是创建该类的实例后,该实例的实例变量是不可改变的。Java提供的8个包装类和String类都是不可变类。
2 创建自定义不可变类要满足以下几个条件。
- 使用private和final修饰符来修饰该类的成员变量。
- 提供带参数的构造器,用于根据传入参数来初始化类里属性
- 仅为该类的成员变量提供getter方法,而不提供setter方法。
- 如有必要,重写Object类中的hashcode和equaIs方法。
二测试不可变类String
1代码示例
public class ImmutableStringTest { public static void main(String[] args) { String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1 == str2); // 输出false System.out.println(str1.equals(str2)); // 输出true // 下面两次输出的hashCode相同 System.out.println(str1.hashCode()); System.out.println(str2.hashCode()); } }
2运行结果
false
true
69609650
69609650
3结果分析
从运行结果来看,它是根据String对象里的字符序列作为相等的标准,其中hashCode方法也是根据字符序列计算得到的。
三自定义不可变类
1代码示例
public class Address { private final String detail; private final String postCode; // 在构造器里初始化两个实例变量 public Address() { this.detail = ""; this.postCode = ""; } public Address(String detail , String postCode) { this.detail = detail; this.postCode = postCode; } // 仅为两个实例变量提供getter方法 public String getDetail() { return this.detail; } public String getPostCode() { return this.postCode; } //重写equals()方法,判断两个对象是否相等。 public boolean equals(Object obj) { if (this == obj) { return true; } if(obj != null && obj.getClass() == Address.class) { Address ad = (Address)obj; // 当detail和postCode相等时,可认为两个Address对象相等。 if (this.getDetail().equals(ad.getDetail()) && this.getPostCode().equals(ad.getPostCode())) { return true; } } return false; } public int hashCode() { return detail.hashCode() + postCode.hashCode() * 31; } }
2代码分析
当程序创建了Address对象后,同样无法修改Address对象的detail和postCode实例变量。
相关推荐
Java中的不可变类机制是一种设计模式,用于创建对象在创建后其状态无法改变的类。不可变类在多线程环境中特别有用,因为它们天生线程安全,无需额外的同步措施。不可变类的一些典型例子包括`Integer`、`Long`和`...
在 Java 中实现不可变类是提高程序安全性和可维护性的重要手段,尤其是在函数式编程中。不可变类的核心特性是其对象一旦创建,其状态就不能再发生改变。这是因为不可变对象具有以下优点: 1. **线程安全**:由于...
1. final变量的细节特征: 1. Java核心类库就提供了很多不可变类: 因此可以放心使用 2. 如何设计自定义的不可变类呢 3. 可变类型数据成
不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。 那么,什么是不可变对象? 一旦一个类的实例化对象被创建并初始化,那么它不可以被改变。我们可以调用访问器方法(getter),...
Java中的不可变类(immutable)是一种特殊的类,其对象一旦创建后,其状态就不能再发生变化。这类类在Java中有着重要的地位,特别是String类,它是Java中最常用的不可变类之一。不可变类的设计旨在提高安全性、效率...
Java String类为什么是不可变的_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
来看个不可变类示例:ThreeStooges类是一个不可变类, 它的状态在创建后不能再修改,所有域都是final类型,并且它被正确创建(创建期间没有发生this引用的逸出)。该类有三个方法:isStooge、getStoogeNames,都是...
例如,一个简单的不可变类定义可能如下: ```java @Value.Immutable public interface Person { String getName(); int getAge(); } ``` 通过注解,Immutables会自动生成一个完整的类实现,包括一个无参构造函数...
1. 不可变类的概念: 不可变类是指一旦创建了对象,其状态就不能再改变的类。这种类通常具有以下特征:类本身是final的,成员变量是private final的,没有提供修改成员变量的方法。不可变类的设计在多线程环境下特别...
在Python编程语言中,对象分为可变对象和不可变对象,这一特性对于理解和优化代码有着重要的影响。可变对象在创建后可以改变其内容,但其内存地址不变,这意味着变量始终指向同一对象;相反,不可变对象一旦创建,就...
String类是不可变类,也就是说String对象声明后,将不可修改。String类的特点是: * 不可变:String对象声明后,将不可修改。 * 常量池:采用双引号赋值字符串,那么在编译期将会放到方法区中的字符串常量池里。 * ...
首先,章节中提到了**不可变对象与不可变类**的概念。不可变对象是指一旦创建后,其内容无法更改的对象,对应的类即为不可变类。例如,如果删除`Circle`类中的`set`方法,使得半径不能被修改,那么该类就变成了不可...
JavaClassImmutable Java类不可变不可变对象是那些一旦创建便无法更改状态的对象,例如String类是不可变类。 不变的对象不能被修改,因此它们在并发执行中也是线程安全的。不变类的特征: 构造简单。 自动线程安全。...
不可变对象(immutable object)是一种一旦创建就不能再改变它的内容的对象,而不可变类(immutable class)是指该类的所有数据都是私有的且没有修改器。例如,Circle 类如果删掉前面的 set 方法,那么该类就变成不...
Java标准库中包含了许多内置的不可变类,这些类提供了不可变性的保证,从而提高了代码的稳定性和安全性。以下是一些常见的不可变类: - **String**: `String` 类是不可变的,这意味着一旦一个字符串对象被创建,它...
根据提供的标题和描述,我们将探讨三个关键知识点:最小化类和成员的可访问性、使用访问方法而非公有域以及使可变性最小化,通过创建不可变类。 首先,让我们深入理解"使类和成员的可访问性最小化"这一原则。在面向...
在C#11中,引入了一些新特性来支持不可变编程,如记录类型(Record Types),它们是自动实现浅克隆的不可变类,且提供相等比较和字符串表示的便捷方法。这些新特性使得创建和使用不可变对象更加简便和直观。 总的来...
在编程领域,不可变对象和不可变类是重要的概念,特别是在多线程和并发编程中。不可变对象是指一旦创建后,其状态就不能更改的对象。不可变类则是指所有实例在其生命周期内都无法改变其内部状态的类。这些特性带来了...