如何在 Java 中编写 equals 等价方法
本文描述了一种重写 equals 方法的技术,该方法即使在具体类的子类添加新字段时也能保留 equals 的约定。子类化时保留 equals contract 的是“面向对象语言中等价关系的基本问题”。除非你愿意放弃面向对象抽象的好处,否则无法在保留 equals 契约的同时扩展可实例化类并添加值组件。...
JAVA 高并发之 java.util.concurrent 概述
java.util.concurrent 包为创建高并发应用提供了工具。本文将对此包做一个概述。java.util.concurrent 包含了太多的功能,无法在一篇文章中进行讨论。本文中,我们将主要关注此包中一些最有用的实用功能,如:Executor、ExecutorService、ScheduledExecutorService、...
Java 中的 CountDownLatch 指南
本文中,我们将提供 CountDownLatch 类的指南,并演示如何在几个实际示例中使用它。本质上,通过使用 CountDownLatch,我们可以让线程阻塞,直到其他线程完成给定的任务。简单地说,CountDownLatch 有一个计数器(counter)字段,你可以根据需要递减。然后我们可以使用它来阻塞调用线程,直到它被...
Java 中的 Semaphore
本文中,我们将探讨 Java 中信号量(semphore)和 mutex 的基础。我们将从 java.util.concurrent.Semaphore 开始。我们可以使用信号量(semaphore)来限制访问特定资源的并发线程的数量。在以下示例中,我们将实现一个简单的登录队列来限制系统中的用户数量:class LoginQu...
如何使用 Hibernate 实现软删除
某些应用中,你不希望或不允许从数据库中永久删除记录。但仍然需要删除或隐藏不再活动的记录。一个例子可能是想要保留的用户帐户,因为它链接到仍在使用的其他业务对象。你有两个基本选项可以将这些信息保存在系统中。你可以保留记录所有更改的审核日志,也可以执行隐藏已删除记录的软删除。我在关于Hibernate Envers 的文章中解释了审计日志选项。今天,我想展示如何使...
Lombok & Hibernate: 如何避免常见的陷阱
Lombok 是 Java 开发人员中流行的框架,因为它生成重复的样板代码,如 getter 和 setter 方法、equals 和 hashCode 方法以及默认构造函数。你所需要做的就是向类中添加一些注释,Lombok 将在编译时添加所需的代码。这对于普通类来说效果相当好,但如果将其用于 Hibernate 实体,则会引入一些危险的陷阱。为了避免这些陷...
Lombok 项目介绍
Java 是一种很棒的语言,但对于我们在代码中必须执行的常见任务或遵守某些框架实践来说,它有时会变得过于冗长。这通常不会给我们项目的商业方面带来任何真正的价值,而这正是 Lombok 让我们更有效率的地方。它的工作方式是嵌入到我们的编译过程,并根据我们在代码中引入的诸多项目注释,将 Java 字节码自动生成到 .class 文件中。将它引入...
Java ConcurrentMap 指南
Map 天然是 Java 集合中最广泛的样式之一。而且,重要的是,HashMap 不是线程安全的实现,而 Hashtable 确实通过同步操作提供了线程安全。尽管 Hashtable 是线程安全的,但它的效率不是很高。另一个完全同步的 Map(Collections.synchronizedMap)也没有表现出很高的效率。如果我们想要在高并发下具有...
Java HashMap 指南
本文中,我们将了解如何在 Java 中使用 HashMap,以及它在内部的工作方式。Hashtable 是一个与 HashMap 非常相似的类。要了解 Hashtable 类本身以及 HashMap 和 Hashtable 之间的区别,看参照此文。我们先来看看 HashMap 是一个映射指的着什么。映射是键值对映射,这意味着每个键都映...