杰瑞科技汇

Java对象如何正确添加?

Java 对象本身是一个独立的实例,你不能像往列表里添加元素那样“往一个对象里添加另一个对象”,你可以通过修改对象的状态(即其成员变量)来达到“添加”数据的效果。

Java对象如何正确添加?-图1
(图片来源网络,侵删)

下面我将从几种最常见的场景来解释如何向 Java 对象“添加”内容。


向对象中添加一个简单的属性值

这是最常见的情况,你的对象代表一个实体,Person,你想给这个 Person 对象增加一个属性,email

方法:直接修改对象的成员变量

假设你有一个 Student 类,你想为这个学生对象添加一个分数。

Java对象如何正确添加?-图2
(图片来源网络,侵删)

定义类

你的类需要有相应的成员变量,并提供一个修改它们的方法(通常是 setter 方法)。

// Student.java
public class Student {
    // 成员变量
    private String name;
    private int age;
    private String email; // 假设我们要添加这个新属性
    // 构造函数
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    // 新添加的属性的 Getter 和 Setter
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

创建对象并“添加”属性

// Main.java
public class Main {
    public static void main(String[] args) {
        // 1. 创建一个 Student 对象
        Student student1 = new Student("张三", 20);
        // 2. "添加" email 属性
        // 通过调用 setEmail() 方法来修改 student1 对象的状态
        student1.setEmail("zhangsan@example.com");
        // 3. 验证
        System.out.println(student1); // 会调用 toString() 方法
        // 输出: Student{name='张三', age=20, email='zhangsan@example.com'}
    }
}

这是“添加”属性最基础的方式,核心是通过 setter 方法修改对象的内部状态


向对象中添加一个“子对象”或关联对象

这种情况更复杂一些,比如一个 Order (订单) 对象,需要包含多个 Item (商品) 对象。

在类内部维护一个集合(如 List

这是最推荐、最灵活的方式。

Java对象如何正确添加?-图3
(图片来源网络,侵删)

定义类

// Item.java
public class Item {
    private String itemName;
    private double price;
    public Item(String itemName, double price) {
        this.itemName = itemName;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Item{" + "itemName='" + itemName + '\'' + ", price=" + price + '}';
    }
}
// Order.java
import java.util.ArrayList;
import java.util.List;
public class Order {
    private String orderId;
    private List<Item> items; // 使用 List 来存储 Item 对象
    public Order(String orderId) {
        this.orderId = orderId;
        this.items = new ArrayList<>(); // 必须初始化这个集合
    }
    // 核心:添加 Item 对象的方法
    public void addItem(Item item) {
        this.items.add(item);
    }
    // 可选:一个方便的重载方法,直接通过参数创建 Item
    public void addItem(String itemName, double price) {
        this.items.add(new Item(itemName, price));
    }
    @Override
    public String toString() {
        return "Order{" +
                "orderId='" + orderId + '\'' +
                ", items=" + items +
                '}';
    }
}

创建对象并“添加”子对象

// Main.java
public class Main {
    public static void main(String[] args) {
        // 1. 创建一个 Order 对象
        Order myOrder = new Order("ORD-12345");
        // 2. 创建一些 Item 对象
        Item item1 = new Item("Java编程思想", 108.5);
        Item item2 = new Item("Effective Java", 89.0);
        // 3. 将 Item 对象 "添加" 到 Order 对象中
        myOrder.addItem(item1);
        myOrder.addItem(item2);
        // 也可以直接调用重载方法添加
        myOrder.addItem("设计模式", 79.8);
        // 4. 验证
        System.out.println(myOrder);
        // 输出:
        // Order{orderId='ORD-12345', items=[Item{itemName='Java编程思想', price=108.5}, Item{itemName='Effective Java', price=89.0}, Item{itemName='设计模式', price=79.8}]}
    }
}

当一个对象需要包含多个其他对象时,最佳实践是在类中定义一个 ListSetMap 等集合类型的成员变量,并提供一个 addXxx() 方法来向这个集合中添加元素。


向不可变对象中“添加”内容

有时你设计的类是不可变的(Immutable),即其创建后状态就不能改变(成员变量都是 final 的,且没有 setter),这种情况下,你不能直接修改对象。

方法:返回一个包含新状态的新对象

这种模式在函数式编程中很常见,Java 中的 String 类就是不可变的。

定义不可变类

// ImmutableUser.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class ImmutableUser { // 用 final 确保不能被继承
    private final String name;
    private final List<String> roles; // roles 也是 final 的
    public ImmutableUser(String name, List<String> roles) {
        // 为了保证外部代码不能修改内部的 roles,我们需要创建一个防御性拷贝
        this.name = name;
        this.roles = new ArrayList<>(roles);
    }
    // 只有 getter,没有 setter
    public String getName() {
        return name;
    }
    // 返回一个不可修改的视图,防止外部修改内部集合
    public List<String> getRoles() {
        return Collections.unmodifiableList(roles);
    }
    // "添加"新角色的方法:它不修改当前对象,而是返回一个新对象
    public ImmutableUser addRole(String newRole) {
        // 1. 创建当前对象状态的拷贝
        List<String> newRoles = new ArrayList<>(this.roles);
        // 2. 修改拷贝
        newRoles.add(newRole);
        // 3. 返回一个包含新状态的新对象
        return new ImmutableUser(this.name, newRoles);
    }
    @Override
    public String toString() {
        return "ImmutableUser{" +
                "name='" + name + '\'' +
                ", roles=" + roles +
                '}';
    }
}

使用不可变对象

// Main.java
import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        // 1. 创建一个初始的不可变用户对象
        List<String> initialRoles = Arrays.asList("user", "member");
        ImmutableUser user1 = new ImmutableUser("李四", initialRoles);
        System.out.println("原始用户: " + user1);
        // 2. "添加"一个新角色
        // 因为 user1 是不可变的,addRole 不会改变它
        // 它会返回一个包含新角色的新对象
        ImmutableUser user2 = user1.addRole("admin");
        System.out.println("添加角色后的原始用户: " + user1); // 原对象未改变
        System.out.println("创建的新用户: " + user2);         // 新对象包含了新角色
    }
}

输出:

原始用户: ImmutableUser{name='李四', roles=[user, member]}
添加角色后的原始用户: ImmutableUser{name='李四', roles=[user, member]}
创建的新用户: ImmutableUser{name='李四', roles=[user, member, admin]}

对于不可变对象,“添加”操作意味着创建并返回一个包含新数据的新实例,而不是修改原对象,这种方式线程安全,但可能会产生更多的对象。


总结与最佳实践

场景 目标 方法 关键点
添加简单属性 修改对象的一个字段 提供 setter 方法 通过方法封装,保证逻辑可控。
添加子对象/集合 让一个对象包含多个其他对象 在类中维护一个 List/Set,并提供 addItem() 方法 推荐做法,灵活性高,符合面向对象设计。
添加到不可变对象 保持对象不变的同时增加数据 创建并返回一个包含新数据的新对象 保证线程安全和数据一致性,适用于函数式风格。

向 Java 对象“添加”内容,本质上是改变对象的状态,选择哪种方式取决于你的设计需求(是否可变、数据结构等),最常见和推荐的方式是在对象内部使用集合,并提供添加方法

分享:
扫描分享到社交APP
上一篇
下一篇