Java多态优化:消除printAnimals冗余循环 新增子类无需修改方法
救援动物管理系统代码优化方案
现有代码存在两个核心可优化点:
printAnimals()方法存在重复循环逻辑,新增动物子类时必须修改该方法才能支持打印,违反开闭原则- 业务逻辑过度集中在
Driver驱动类,父类RescueAnimal抽象程度不足,子类通用逻辑没有下沉
一、解决printAnimals()冗余循环问题
核心思路是利用多态特性:
- 把分类型存储的
dogList、monkeyList合并为一个存储RescueAnimal父类类型的通用列表 - 在父类中定义通用的信息打印方法,子类重写该方法输出自身特有属性,打印时无需判断动物类型,直接调用通用方法即可
- 后续新增
RescueAnimal子类时,只需要重写打印信息方法,不需要修改printAnimals()的任何代码
优化后的核心代码实现
首先调整父类RescueAnimal,新增通用的信息输出方法:
public class RescueAnimal { private String name; private String animalType; public RescueAnimal() {} // 通用信息打印方法,子类重写扩展特有属性输出 public void printInfo() { System.out.print("*" + name); } // 原有getter/setter保留 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAnimalType() { return animalType; } public void setAnimalType(String animalType) { this.animalType = animalType; } }
然后调整子类,重写printInfo()方法:
public class Dog extends RescueAnimal { private String breed; public Dog(String name, String breed) { setName(name); setBreed(breed); setAnimalType("Dog"); } @Override public void printInfo() { super.printInfo(); System.out.println(",品种:" + breed); } // 原有breed的getter/setter保留 public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } } public class Monkey extends RescueAnimal { private String species; public Monkey(String name, String species) { setName(name); setSpecies(species); setAnimalType("Monkey"); } @Override public void printInfo() { super.printInfo(); System.out.println(",物种:" + species); } // 原有species的getter/setter保留 public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } }
最后调整Driver类的逻辑,合并列表、简化printAnimals()方法:
import java.util.ArrayList; import java.util.Scanner; public class Driver { // 替换原来两个独立列表,用父类类型统一存储所有动物 private static ArrayList<RescueAnimal> animalList = new ArrayList<>(); public static void main(String[] args) { initializeAnimalList(); Scanner input = new Scanner(System.in); boolean takingInput = true; do { displayMenu(); String command = input.nextLine(); switch(command) { case"1": printAnimals("Dog"); break; case"2": printAnimals("Monkey"); break; case"q": takingInput = false; break; default: System.out.println("无效输入"); } }while(takingInput); System.out.println("程序退出"); } public static void displayMenu() { System.out.println("\n\n"); System.out.println("\t\t\t\t救援动物管理系统菜单"); System.out.println("[1] 打印所有狗的列表"); System.out.println("[2] 打印所有猴子的列表"); System.out.println("[q] 退出程序"); System.out.println(); System.out.println("请输入选项:"); } // 初始化数据,统一加入通用列表 public static void initializeAnimalList() { animalList.add(new Dog("Spot", "德国牧羊犬")); animalList.add(new Dog("Rex", "大丹犬")); animalList.add(new Dog("Bella", "吉娃娃")); animalList.add(new Monkey("Bobo", "狨猴")); animalList.add(new Monkey("Shuga", "柽柳猴")); animalList.add(new Monkey("Coco", "卷尾猴")); } // 简化后的打印方法,不需要为每个子类写独立循环 public static void printAnimals(String animalType) { System.out.println("----- " + animalType + "列表 -----"); // 过滤出对应类型的动物,直接调用子类重写的printInfo方法 for (RescueAnimal animal : animalList) { if (animal.getAnimalType().equalsIgnoreCase(animalType)) { animal.printInfo(); } } } }
二、类结构调整建议
现有设计确实需要调整,逻辑不应该全部集中在Driver类中,优化方向如下:
- 把和动物自身属性、行为相关的逻辑下沉到
RescueAnimal父类和对应子类,比如单个动物的信息输出、属性校验逻辑,不需要放在Driver中实现 - 可以新增独立的业务类,封装动物的新增、查重、列表查询、打印等逻辑,
Driver类只负责菜单展示、用户输入接收等流程控制逻辑,职责更清晰 - 原来的
intakeNewDog、intakeNewMonkey这类重复的录入逻辑也可以合并为通用方法,根据传入的动物类型实例化对应对象,进一步消除冗余代码 - 注意修复原代码中的语法错误:比如
printAnimals方法里字符串拼接缺少+号、intakeNewMonkey方法里species变量没有声明就直接使用的问题
优化后代码完全符合开闭原则:后续如果要新增猫、兔子等其他救援动物类型,只需要新建类继承
RescueAnimal、重写printInfo方法、在初始化和菜单中加入对应选项即可,不需要修改打印、录入等核心通用逻辑。
内容的提问来源于stack exchange,提问作者user18942073
相关产品推荐
相关产品推荐

