You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从User Interface类访问Directory类中的ArrayList?

如何在User Interface类中访问Directory的ArrayList

嘿,你已经搞定了Directory和Person类,现在就差UI类了对吧?其实要在UI里访问Directory的ArrayList,核心是遵循面向对象的封装原则——别直接把ArrayList暴露出去,而是通过公共方法来提供安全的访问途径,这样代码更健壮也更容易维护。下面给你一步步说明:

第一步:给Directory类添加公共访问方法

首先,你需要在已经写好的Directory类里,添加用于访问或操作内部ArrayList的公共方法。这里有两种常见的方式,根据你的需求选择:

方式1:提供获取列表的方法(推荐返回副本)

如果UI需要遍历所有Person元素,你可以写一个返回ArrayList的方法,但最好返回原列表的副本,避免外部代码直接修改Directory的内部状态:

import java.util.ArrayList;

public class Directory {
    // 你的内部ArrayList,用private修饰保证封装
    private ArrayList<Person> personList;

    // 你的构造方法,已经包含加载文本文件的逻辑
    public Directory() {
        personList = new ArrayList<>();
        // 调用你写的加载文件方法,比如loadFromFile();
    }

    // 获取联系人列表(返回副本,安全)
    public ArrayList<Person> getPersonList() {
        return new ArrayList<>(personList);
    }

    // 如果需要允许UI添加联系人,再加一个添加方法
    public void addPerson(Person person) {
        personList.add(person);
        // 这里可以加上保存到文件的逻辑,比如saveToFile();
    }

    // 还可以添加其他业务方法,比如根据姓名查找联系人
    public Person findPersonByName(String name) {
        for (Person p : personList) {
            if (p.getName().equalsIgnoreCase(name)) {
                return p;
            }
        }
        return null;
    }
}

方式2:提供细粒度的操作方法

如果UI不需要整个列表,只需要特定操作(比如获取某个联系人、删除联系人),可以只提供对应的方法,完全隐藏ArrayList的存在,这是更严格的封装。

第二步:在User Interface类中调用这些方法

现在你可以在UI类里实例化Directory对象,然后通过上面的方法来访问或操作数据。举个简单的控制台UI例子:

import java.util.Scanner;
import java.util.ArrayList;

public class UserInterface {
    private Directory directory;
    private Scanner inputScanner;

    public UserInterface() {
        directory = new Directory();
        inputScanner = new Scanner(System.in);
        showMainMenu();
    }

    private void showMainMenu() {
        while (true) {
            System.out.println("\n=== 联系人管理系统 ===");
            System.out.println("1. 查看所有联系人");
            System.out.println("2. 添加新联系人");
            System.out.println("3. 查找联系人");
            System.out.println("4. 退出");
            System.out.print("请选择操作:");
            
            int choice = inputScanner.nextInt();
            inputScanner.nextLine(); // 处理输入后的换行符

            switch (choice) {
                case 1:
                    displayAllPersons();
                    break;
                case 2:
                    addNewPerson();
                    break;
                case 3:
                    searchPerson();
                    break;
                case 4:
                    System.out.println("感谢使用,再见!");
                    return;
                default:
                    System.out.println("无效选项,请重新输入!");
            }
        }
    }

    // 查看所有联系人
    private void displayAllPersons() {
        ArrayList<Person> persons = directory.getPersonList();
        if (persons.isEmpty()) {
            System.out.println("当前没有任何联系人");
            return;
        }
        System.out.println("\n所有联系人信息:");
        for (Person p : persons) {
            System.out.printf("姓名:%s | 首字母:%s | 电话:%s%n", 
                p.getName(), p.getInitial(), p.getPhoneNumber());
        }
    }

    // 添加新联系人
    private void addNewPerson() {
        System.out.print("请输入姓名:");
        String name = inputScanner.nextLine();
        System.out.print("请输入首字母:");
        String initial = inputScanner.nextLine();
        System.out.print("请输入电话号码:");
        String phone = inputScanner.nextLine();

        Person newPerson = new Person(name, initial, phone);
        directory.addPerson(newPerson);
        System.out.println("联系人添加成功!");
    }

    // 查找联系人
    private void searchPerson() {
        System.out.print("请输入要查找的姓名:");
        String searchName = inputScanner.nextLine();
        Person foundPerson = directory.findPersonByName(searchName);
        
        if (foundPerson != null) {
            System.out.printf("找到联系人:姓名:%s | 首字母:%s | 电话:%s%n",
                foundPerson.getName(), foundPerson.getInitial(), foundPerson.getPhoneNumber());
        } else {
            System.out.println("未找到该联系人");
        }
    }

    public static void main(String[] args) {
        new UserInterface();
    }
}

为什么不直接暴露ArrayList?

直接把personList设为public让UI直接访问,虽然简单,但会带来两个问题:

  • 破坏封装:外部代码可以随意修改列表(比如直接调用personList.clear()),导致Directory的内部状态失控。
  • 难以维护:如果以后你想把ArrayList换成其他集合类(比如LinkedList),所有直接访问personList的代码都要修改,而用公共方法的话,只需要修改Directory内部的实现即可。

内容的提问来源于stack exchange,提问作者Deem Ah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:20:17