搜索
首页Javajava教程Java 中的不可变类

在这篇文章中,我们将解释java中的不可变类。此外,我们还将看到不可变类的用途。将有 java 代码示例展示如何在 java 中创建不可变类。不可变类是其内容不能更改的类。

以下是关于不可变类的一些要点:

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

  • 不可变类的对象称为不可变对象。在处理不可变对象时,我们不允许在对象创建后更改其状态。每当对象的状态发生变化时,我们都会得到一个新对象。
  • 不可变类不提供任何更改其内容的方法。
  • 在 Immutable 类中,只有 getter 方法可用,而没有 setter 方法。
  • 不可变类本质上默认是线程安全的。
  • Java 遗留类、包装类、String 类是 java 中不可变类的示例。

如何在 Java 中使用不可变类?

在使用此类之前,了解不可变类是如何创建的非常重要。以下是创建课程时需要牢记的要点:

  • 不可变类必须是final的,因为它不应该被继承。
  • 不可变类的所有字段都应该是final的。
  • 如果任何可变对象用作不可变类中的字段,则必须进行特殊处理以防止其内容被修改。
  • 应该存在公共构造函数。
  • 应该定义所有变量的 getter 方法。
  • 任何变量都不应该出现 Setter 方法。

以下是java中不可变类的主要用途:

  • 简单性:由于在不可变类的情况下,每个类都处于单一状态;因此,这是一个简单的设计模式。
  • 线程安全:不可变类的另一个优点是在多线程环境中,由于不可变类的线程安全性质,不需要同步。
  • 健壮的设计:在应用程序中编写不可变的类会产生健壮的代码。

除了列出的优点之外,使用不可变类时还可能存在一些性能问题。因此,在线程安全和其他功能不重要的情况下,我们可以考虑使用可变类来提高性能。

Java 中不可变类的示例

以下是提到的示例:

示例 #1 – 创建不可变类

现在我们将看到 Java 代码示例,展示了在 Java 中创建不可变类。下面是一个 java 代码示例,展示了如何在 java 中创建不可变类:

代码:

package com.edubca.immutabledemo;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
public ImmutableDemo  (String studentName, int rollNumber) {
this.studentName = studentName;
this.rollNumber = rollNumber;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public static void main(String[] args) {
ImmutableDemo obj = new ImmutableDemo  ("John" , 100);
// Since no getters are available contents cannot be modified.
// Also as variables are declared final they cannot be modified
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
}
}

输出:

Java 中的不可变类

上面的代码显示了一个不可变类的创建,该类不包含任何可变对象作为类成员。

示例 #2 – Java 中的不可变类示例

现在我们将了解如何创建以可变对象作为其成员的不可变类。为了在这种情况下保持不变性,需要进行一些特殊处理。

不可变类中的可变对象的问题:

这是正常的代码示例,显示创建其中包含可变成员的不可变类:

代码:

package com.edubca.immutabledemo;
import java.util.Date;
import java.text.SimpleDateFormat;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
final Date birthDate;
public ImmutableDemo  (String studentName, int rollNumber, Date birthDate) {
this.studentName = studentName;
this.rollNumber = rollNumber;
this.birthDate=birthDate;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public Date getBirthDate() {
return birthDate;
}
public static void main(String[] args) throws Exception {
String birthDate= "31/09/1997";
ImmutableDemo obj = new ImmutableDemo  ("John" , 100, new SimpleDateFormat("dd/MM/yyyy").parse(birthDate));
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
obj.getBirthDate().setTime(1000);
System.out.println("After changing birth date>>>>>>>>>>>>");
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
}
}

输出:

Java 中的不可变类

从上面的输出中,我们可以看到,由于出生日期更改,对象的内容也发生了更改。这打破了不可变类的规则。

不可变类中的可变对象问题的解决方案:

为了处理这种情况,需要在代码中进行一些更改。在修改后的代码中,当从获取方法返回可变对象时,我们不返回原始对象;相反,我们返回对象的克隆。因此,对克隆对象的更改不会对原始对象产生任何影响。这是修改后的代码:

代码:

package com.edubca.immutabledemo;
import java.util.Date;
import java.text.SimpleDateFormat;
public final class ImmutableDemo {
final String studentName;
final int rollNumber;
final Date birthDate;
public ImmutableDemo  (String studentName, int rollNumber, Date birthDate) {
this.studentName = studentName;
this.rollNumber = rollNumber;
this.birthDate=birthDate;
}
public String getStudentName() {
return studentName;
}
public int getRollNumber() {
return rollNumber;
}
public Date getBirthDate() {
return (Date)birthDate.clone();
}
public static void main(String[] args) throws Exception {
String birthDate= "31/09/1997";
ImmutableDemo obj = new ImmutableDemo  ("John" , 100, new SimpleDateFormat("dd/MM/yyyy").parse(birthDate));
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
obj.getBirthDate().setTime(1000);
System.out.println("After changing birth date>>>>>>>>>>>>");
System.out.println("Name is " + obj.getStudentName());
System.out.println("Roll Number is " + obj.getRollNumber());
System.out.println("Birth date is " + obj.getBirthDate());
}
}

输出:

Java 中的不可变类

从上面的输出中,我们可以看到日期值没有变化;因此,类的不变性保持不变。 

结论

通过上面的讨论,我们对java不可变类有了清晰的认识。而且,我们也看到了它的优点。

以上是Java 中的不可变类的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
带你搞懂Java结构化数据处理开源库SPL带你搞懂Java结构化数据处理开源库SPLMay 24, 2022 pm 01:34 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

Java集合框架之PriorityQueue优先级队列Java集合框架之PriorityQueue优先级队列Jun 09, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

完全掌握Java锁(图文解析)完全掌握Java锁(图文解析)Jun 14, 2022 am 11:47 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

一起聊聊Java多线程之线程安全问题一起聊聊Java多线程之线程安全问题Apr 21, 2022 pm 06:17 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

详细解析Java的this和super关键字详细解析Java的this和super关键字Apr 30, 2022 am 09:00 AM

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

Java基础归纳之枚举Java基础归纳之枚举May 26, 2022 am 11:50 AM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

java中封装是什么java中封装是什么May 16, 2019 pm 06:08 PM

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

归纳整理JAVA装饰器模式(实例详解)归纳整理JAVA装饰器模式(实例详解)May 05, 2022 pm 06:48 PM

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器