如何从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
相关产品推荐
相关产品推荐

