`
cakin24
  • 浏览: 1396829 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

不可变类

    博客分类:
  • java
阅读更多

一概念介绍

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实例变量。

1
1
分享到:
评论

相关推荐

    Java不可变类机制浅析

    Java中的不可变类机制是一种设计模式,用于创建对象在创建后其状态无法改变的类。不可变类在多线程环境中特别有用,因为它们天生线程安全,无需额外的同步措施。不可变类的一些典型例子包括`Integer`、`Long`和`...

    如何在 Java 中实现不可变类

    在 Java 中实现不可变类是提高程序安全性和可维护性的重要手段,尤其是在函数式编程中。不可变类的核心特性是其对象一旦创建,其状态就不能再发生改变。这是因为不可变对象具有以下优点: 1. **线程安全**:由于...

    double-cute#note#final & 不可变类1

    1. final变量的细节特征: 1. Java核心类库就提供了很多不可变类: 因此可以放心使用 2. 如何设计自定义的不可变类呢 3. 可变类型数据成

    Java如何创建不可变类

     不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。  那么,什么是不可变对象?  一旦一个类的实例化对象被创建并初始化,那么它不可以被改变。我们可以调用访问器方法(getter),...

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

    Java中的不可变类(immutable)是一种特殊的类,其对象一旦创建后,其状态就不能再发生变化。这类类在Java中有着重要的地位,特别是String类,它是Java中最常用的不可变类之一。不可变类的设计旨在提高安全性、效率...

    Java String类为什么是不可变的_动力节点Java学院整理

    Java String类为什么是不可变的_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Java并发编程规则:不可变对象永远是线程安全的.docx

    来看个不可变类示例:ThreeStooges类是一个不可变类, 它的状态在创建后不能再修改,所有域都是final类型,并且它被正确创建(创建期间没有发生this引用的逸出)。该类有三个方法:isStooge、getStoogeNames,都是...

    immutables,用于创建不可变对象和生成器的注释处理器。感觉像是番石榴的不可变集合,但对于常规值对象。包括json、jackson、gson、jax-rs、mongodb集成.zip

    例如,一个简单的不可变类定义可能如下: ```java @Value.Immutable public interface Person { String getName(); int getAge(); } ``` 通过注解,Immutables会自动生成一个完整的类实现,包括一个无参构造函数...

    3180106071_刘轩铭_homework31

    1. 不可变类的概念: 不可变类是指一旦创建了对象,其状态就不能再改变的类。这种类通常具有以下特征:类本身是final的,成员变量是private final的,没有提供修改成员变量的方法。不可变类的设计在多线程环境下特别...

    Python可变对象与不可变对象

    在Python编程语言中,对象分为可变对象和不可变对象,这一特性对于理解和优化代码有着重要的影响。可变对象在创建后可以改变其内容,但其内存地址不变,这意味着变量始终指向同一对象;相反,不可变对象一旦创建,就...

    Java常用类讲义大全.docx

    String类是不可变类,也就是说String对象声明后,将不可修改。String类的特点是: * 不可变:String对象声明后,将不可修改。 * 常量池:采用双引号赋值字符串,那么在编译期将会放到方法区中的字符串常量池里。 * ...

    Java语言程序设计-基础篇-中文ppt-第十章.ppt

    首先,章节中提到了**不可变对象与不可变类**的概念。不可变对象是指一旦创建后,其内容无法更改的对象,对应的类即为不可变类。例如,如果删除`Circle`类中的`set`方法,使得半径不能被修改,那么该类就变成了不可...

    JavaClassImmutable:Java类不可变

    JavaClassImmutable Java类不可变不可变对象是那些一旦创建便无法更改状态的对象,例如String类是不可变类。 不变的对象不能被修改,因此它们在并发执行中也是线程安全的。不变类的特征: 构造简单。 自动线程安全。...

    Java语言程序设计中文ppt第十章(对象详解)

    不可变对象(immutable object)是一种一旦创建就不能再改变它的内容的对象,而不可变类(immutable class)是指该类的所有数据都是私有的且没有修改器。例如,Circle 类如果删掉前面的 set 方法,那么该类就变成不...

    ImmutableObjects

    Java标准库中包含了许多内置的不可变类,这些类提供了不可变性的保证,从而提高了代码的稳定性和安全性。以下是一些常见的不可变类: - **String**: `String` 类是不可变的,这意味着一旦一个字符串对象被创建,它...

    effectiveJava课件分享

    根据提供的标题和描述,我们将探讨三个关键知识点:最小化类和成员的可访问性、使用访问方法而非公有域以及使可变性最小化,通过创建不可变类。 首先,让我们深入理解"使类和成员的可访问性最小化"这一原则。在面向...

    21-C-ImmutableObject-Code.zip

    在C#11中,引入了一些新特性来支持不可变编程,如记录类型(Record Types),它们是自动实现浅克隆的不可变类,且提供相等比较和字符串表示的便捷方法。这些新特性使得创建和使用不可变对象更加简便和直观。 总的来...

    编程技能训练与等级考试辅导:不可变对象和类.pptx

    在编程领域,不可变对象和不可变类是重要的概念,特别是在多线程和并发编程中。不可变对象是指一旦创建后,其状态就不能更改的对象。不可变类则是指所有实例在其生命周期内都无法改变其内部状态的类。这些特性带来了...

Global site tag (gtag.js) - Google Analytics