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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:15:40