在Java中,不可变(Immutable)对象是指一旦创建后其状态就不能被修改的对象。不可变对象具有许多优点,如线程安全、简化编程模型和提高代码的可读性。以下是Java中常见的不可变结构和方法:
### 1. **不可变类**
#### `String`
- **描述**:`String` 是 Java 中最常用的不可变类。
- **示例**:
```java
String s = "Hello";
s = s.concat(" World"); // 创建了一个新的字符串对象,原始对象未改变
```
#### `Integer`, `Long`, `Double`, `Byte`, `Short`, `Character`, `Boolean`
- **描述**:这些包装类都是不可变的。
- **示例**:
```java
Integer i = 10;
i = i + 5; // 创建一个新的 Integer 对象,原始对象未改变
```
#### `BigInteger` 和 `BigDecimal`
- **描述**:用于处理大数的不可变类。
- **示例**:
```java
BigInteger bigInt = new BigInteger("123456789");
bigInt = bigInt.add(new BigInteger("987654321")); // 创建一个新的 BigInteger 对象
```
### 2. **不可变集合**
#### `Collections.unmodifiableXXX`
- **描述**:通过 `Collections` 类提供的静态方法可以将现有的集合转换为不可变集合。
- **示例**:
```java
List<String> mutableList = new ArrayList<>();
mutableList.add("A");
List<String> immutableList = Collections.unmodifiableList(mutableList);
// immutableList.add("B"); // 抛出 UnsupportedOperationException
```
#### `List.of`, `Set.of`, `Map.of` (Java 9+)
- **描述**:Java 9 引入了这些便捷方法来创建不可变集合。
- **示例**:
```java
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("X", "Y", "Z");
Map<String, Integer> map = Map.of("A", 1, "B", 2, "C", 3);
```
#### `Collections.synchronizedXXX`
- **描述**:虽然不是严格意义上的不可变集合,但提供了线程安全的同步视图。
- **示例**:
```java
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
```
### 3. **自定义不可变类**
可以通过以下方式创建自定义不可变类:
#### 基本原则
- **所有字段设为 `final`**:确保字段不能被修改。
- **使用私有构造函数**:防止外部直接实例化。
- **不提供修改器方法**:不提供 `set` 方法。
- **防御性拷贝**:对于可变类型的字段,返回它们的不可变副本。
#### 示例
```java
public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 没有 setter 方法
}
```
### 4. **不可变方法**
某些方法返回不可变的结果,即使它们操作的是可变对象。
#### `String` 的方法
- **`substring`**, **`concat`**, **`replace`** 等方法都返回新的 `String` 对象,而不是修改原对象。
#### `Collections.unmodifiableXXX`
- **描述**:这些方法返回不可变的视图,任何对视图的修改操作都会抛出 `UnsupportedOperationException`。
### 5. **其他不可变结构**
#### `Enum`
- **描述**:枚举类型是天然的不可变类型。
- **示例**:
```java
enum Color {
RED, GREEN, BLUE
}
```
#### `Optional`
- **描述**:`Optional` 类也是不可变的,常用于避免空指针异常。
- **示例**:
```java
Optional<String> optional = Optional.of("Hello");
Optional<String> emptyOptional = Optional.empty();
```
### 总结
Java 提供了许多内置的不可变结构和方法,使得开发者可以轻松地构建线程安全且不易出错的应用程序。常见的不可变结构包括:
- **不可变类**:如 `String`, `Integer`, `BigInteger`, `BigDecimal` 等。
- **不可变集合**:如 `Collections.unmodifiableXXX`, `List.of`, `Set.of`, `Map.of`。
- **自定义不可变类**:遵循不可变设计模式的原则。
- **不可变方法**:如 `String` 类中的许多方法返回新的不可变对象。
这些不可变结构和方法可以帮助开发者编写更可靠、更易于维护的代码。
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传