Java Collections checkedQueue() 方法及示例

2025 年 1 月 6 日 | 阅读 9 分钟

Java Collections Framework 中的 checkedQueue() 方法对于使队列在运行时类型安全非常有用,因此它是一种非常有效且重要的实用程序。正因为如此,checkedQueue() 方法存在于 Collections 类中,因此可以用来创建给定队列的动态类型安全视图。这意味着任何尝试将错误类型的元素插入队列的操作都会导致 ClassCastException。

方法签名

<E>: 这是一个泛型类型参数,可以作为类型并包含其他参数。<E> 表示该方法可以处理队列中类型为 E 的任何对象。

Queue<E>: 这是方法的返回类型。它表示该方法返回一个类型为 <E> 的 Queue。

checkedQueue: 这指的是方法名。

Queue<E> queue: 这是方法的第一个参数。它是一个持有 E 类型元素的 Queue。该方法创建此队列的类型安全视图。

Class<E> type: 这是方法的第二个参数。它是一个表示队列中元素类型的 Class 对象。此参数通过确保只能将指定类型 E 的元素添加到队列中来帮助强制执行类型安全。

示例 1:创建 List 的类型安全视图

在此示例中,我们创建一个常规 Queue,并使用 Collections.checkedQueue() 来包装该队列,指定它应该包含的元素类型,并将元素添加到类型安全的队列中。演示尝试添加不正确类型的元素时会发生什么。遍历队列中的元素以显示正确用法。

文件名: CheckedQueueExample.java

输出

Caught a ClassCastException: Attempt to insert class java.lang.String element into collection with element type class Person
Alice (30)
Bob (25)
After adding another person:
Alice (30)
Bob (25)
Charlie (40)

示例 2:Integer Queue 的基本用法

在此示例中,我们将创建一个用于 Integer 元素的常规队列。使用 Collections.checkedQueue() 包装队列以确保类型安全。向队列中添加有效的 Integer 元素。尝试添加无效元素以演示 checkedQueue 提供的类型安全。遍历队列以显示元素。

文件名: IntegerCheckedQueueExample.java

输出

Caught a ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer
1
2
3

示例 3:具有附加操作的自定义类

在此示例中,我们演示了如何将 Collections.checkedQueue() 与自定义类 Task 一起使用,以强制执行类型安全并执行其他队列操作。Task 类代表一个工作单元,包含描述和优先级。此示例包括添加任务、处理任务以及在与队列交互时确保类型安全。

文件名: TaskCheckedQueueExample.java

输出

Caught a ClassCastException: Attempt to insert class java.lang.String element into collection with element type class Task
Current tasks in the queue:
Task: Finish report, Priority: 1
Task: Email client, Priority: 2
Task: Prepare presentation, Priority: 3
Next task to process: Task: Finish report, Priority: 1
Tasks after adding more:
Task: Email client, Priority: 2
Task: Prepare presentation, Priority: 3
Task: Call supplier, Priority: 4
Task: Update website, Priority: 5
Next task to process: Task: Email client, Priority: 2
Remaining tasks in the queue:
Task: Prepare presentation, Priority: 3
Task: Call supplier, Priority: 4
Task: Update website, Priority: 5

示例 4:PriorityQueue 的混合操作

在此示例中,我们将探讨如何将 Collections.checkedQueue() 与 PriorityQueue 一起使用。PriorityQueue 是 Java 中的一种队列,它根据其自然顺序或在队列构造时提供的自定义比较器来对其元素进行排序。我们将使用自定义类 Task 来表示队列中的项目,并演示各种操作,同时使用 Collections.checkedQueue() 确保类型安全。

文件名: TaskCheckedPriorityQueueExample.java

输出

Caught a ClassCastException: Attempt to insert class java.lang.String element into collection with element type class Task
Current tasks in the queue:
Task: Finish report, Priority: 1
Task: Email client, Priority: 2
Task: Prepare presentation, Priority: 3
Next task to process: Task: Finish report, Priority: 1
Tasks after adding more:
Task: Email client, Priority: 2
Task: Prepare presentation, Priority: 3
Task: Call supplier, Priority: 4
Task: Update website, Priority: 5
Next task to process: Task: Email client, Priority: 2
Remaining tasks in the queue:
Task: Prepare presentation, Priority: 3
Task: Update website, Priority: 5
Task: Call supplier, Priority: 4

示例 5:处理 PriorityBlockingQueue 的不同数据类型

在此示例中,创建了一个 PriorityBlockingQueue 来管理不同数据类型的任务。队列使用 Collections.checkedQueue() 进行包装以强制执行类型安全,确保只能添加 GenericTask 对象。向队列中添加了具有不同数据类型(String、Integer、Double)的各种任务。显示队列中的任务,然后按优先级顺序处理它们,并显示已处理的任务。

文件名: CheckedQueueGenericTaskExample.java

输出

Caught a ClassCastException: Attempt to insert class java.lang.String element into collection with element type class GenericTask
Tasks in the queue:
Task: Finish report, Priority: 1
Task: 123, Priority: 2
Task: 45.67, Priority: 3
Processing tasks in priority order:
Processed: Task: Finish report, Priority: 1
Processed: Task: 123, Priority: 2
Processed: Task: 45.67, Priority: 3

应用

1. 用户界面中的输入验证

在构建图形用户界面 (GUI) 时,通常需要在处理用户输入之前对其进行验证。通过使用 checkedQueue,可以确保输入队列只接受有效的数据类型,从而防止运行时错误。

2. 并发系统中的消息队列

在多线程应用程序中,当多个线程生成和消费消息时,确保消息队列的类型安全至关重要。checkedQueue 可通过强制执行类型约束来帮助防止数据损坏或处理不当。

3. GUI 框架中的事件处理

GUI 框架通常使用事件队列来管理用户交互和系统事件。通过使用 checkedQueue 包装事件队列,可以确保只处理有效的事件对象,从而降低出错的风险。

4. 作业队列中的任务调度

作业调度系统通常使用队列来管理要在特定时间或间隔执行的任务。checkedQueue 可帮助强制执行作业队列中的类型安全,确保只有有效的作业对象被调度执行。