java有哪些不可变对象

zhidiantech · · 28 次点击 · · 开始浏览    
在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` 类中的许多方法返回新的不可变对象。 这些不可变结构和方法可以帮助开发者编写更可靠、更易于维护的代码。
28 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传