Java面向对象实践--开发团队调度软件(二)

简介: Java面向对象实践--开发团队调度软件(二)

三、代码实现



项目结构


image.png


工具类


用来读取键盘的输入


package com.caq.team.view;
import java.util.Scanner;
/**
 * @ClassName TSUtility01
 * @Description 工具类,用来读取用户的输入
 * @Author Jack
 * @Date 2021/11/8 8:01
 * @Version 1.0
 */
public class TSUtility {
    //System.in作为参数传递给Scanner的构造函数,使Scanner用键盘作为输入,然后用new在内存中实例化一个Scanner出来,使得其它变量能调用这块内存区。
    private static Scanner scan = new Scanner(System.in);
    /**
     * 用来接受用户输入的方法
     * @param limit
     * @param blackReturn
     * @return
     */
    private static String readKeyBoard(int limit, boolean blackReturn) {
        String line = "";
        while (scan.hasNext()) {
            line = scan.nextLine();
            if (line.length() == 0) {
                if (blackReturn) {
                    return line;
                } else continue;
            }
            if (line.length() < 1 || line.length() > limit) {
                System.out.println("输入长度不大于(不大于" + limit + ")" + "请重新输入");
                continue;
            }
            break;
        }
        return line;
    }
    /**
     * 读取菜单中的选项
     * @return 1,2,3,4数字
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4'){
                System.out.println("输入错误,请重新输入");
            }else break;
        }
        return c;
    }
    /**
     * 提升并等待,直到用户按回车后返回
     */
    public static void readReturn(){
        System.out.println("按回车继续........");
        readKeyBoard(100,true);
    }
    /**
     * 读取字符串,将字符串转化为int类型的数
     * @return 一个整数
     */
    public static int readInt(){
        int n;
        for (;;){
            String str = readKeyBoard(2,false);
            // parseInt(String s) 将字符串参数解析为带符号的十进制整数。
            try {
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e){
                System.out.println("数字输入错误,请重新输入");
            }
        }
        return n;
    }
    /**
     * 从键a盘读取Y和N,并将其作为返回值
     * @return
     */
    public static char readConfirmSelection(){
        char c;
        for (;;){
            String str = readKeyBoard(1,false);
            c = str.charAt(0);
            if (c == 'Y' || c == 'N'){
                break;
            }else {
                System.out.println("请输入Y或N!");
            }
        }
        return c;
    }
}


Data类

存放用户的信息


package com.caq.team.service;


public class Data {
    //一些常量
    public static final int EMPLOYEE = 10;
    public static final int PROGRAMMER = 11;
    public static final int DESIGNER = 12;
    public static final int ARCHITECT = 13;
    public static final int PC = 21;
    public static final int NOTEBOOK = 22;
    public static final int PRINTER = 23;
    //Employee  :  10, id, name, age, salary
    //Programmer:  11, id, name, age, salary
    //Designer  :  12, id, name, age, salary, bonus(分红)
    //Architect :  13, id, name, age, salary, bonus, stock(股票)
    //定义二维数组,用来存放职员信息
    //格式为:二维数组存放数据类型[][] 数组名 = {{},{},{}...}
    public static final String[][] EMPLOYEES = {
        {"10", "1", "马云云", "22", "3000"},
        {"13", "2", "马化腾", "32", "18000", "15000", "2000"},
        {"11", "3", "李彦宏", "23", "7000"},
        {"11", "4", "刘强东", "24", "7300"},
        {"12", "5", "雷军军", "28", "10000", "5000"},
        {"11", "6", "任志强", "22", "6800"},
        {"12", "7", "柳传志", "29", "10800","5200"},
        {"13", "8", "杨元庆", "30", "19800", "15000", "2500"},
        {"12", "9", "史玉柱", "26", "9800", "5500"},
        {"11", "10", "丁磊磊", "21", "6600"},
        {"11", "11", "张朝阳", "25", "7100"},
        {"12", "12", "杨致远", "27", "9600", "4800"}
    };
    //如下的EQUIPMENTS数组与上面的EMPLOYEES数组元素一一对应
    //PC      :21, model, display
    //NoteBook:22, model, price
    //Printer :23, name, type 
    public static final String[][] EQUIPMENTS = {
        {},
        {"22", "联想T4", "6000"},
        {"21", "戴尔", "NEC17寸"},
        {"21", "戴尔", "三星 17寸"},
        {"23", "佳能 2900", "激光"},
        {"21", "华硕", "三星 17寸"},
        {"21", "华硕", "三星 17寸"},
        {"23", "爱普生20K", "针式"},
        {"22", "惠普m6", "5800"},
        {"21", "戴尔", "NEC 17寸"},
        {"21", "华硕","三星 17寸"},
        {"22", "惠普m6", "5800"}
    };
}


Equipment接口

package com.caq.team.domain;


public interface Equipment {
    //接口中的方法默认修饰为public abstract,可省略
    String getDescription();
}


PC


实现Equipment接口,返回PC的信息


package com.caq.team.domain;


public class PC implements Equipment{
    private String model;
    private String display;
    public PC() {
    }
    public PC(String model, String display) {
        this.model = model;
        this.display = display;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
    public String getDisplay() {
        return display;
    }
    public void setDisplay(String display) {
        this.display = display;
    }
    @Override
    public String getDescription() {
        return model + "(" + display + ")";
    }
}


Printer


实现Equipment接口,返回Printer的信息


package com.caq.team.domain;


/**
 * @ClassName Printer
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 11:11
 * @Version 1.0
 */
public class Printer implements Equipment {
    private String name;
    private String type;
    public Printer() {
    }
    public Printer(String name, String type) {
        this.name = name;
        this.type = type;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Override
    public String getDescription() {
        return name + "(" + type + ")";
    }
}


NoteBook


实现Equipment接口,返回NoteBook的信息


package com.caq.team.domain;


public class NoteBook implements Equipment {
    private String model;   //机器型号
    private double price;   //价格
    public NoteBook() {
    }
    public NoteBook(String model, double price) {
        this.model = model;
        this.price = price;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String getDescription() {
        return model + "(" + price + ")";
    }
}


Employee对象


将Data类中数组的数据取出,封装到对象中


package com.caq.team.domain;


/**
 * @ClassName Employee
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 11:15
 * @Version 1.0
 */
public class Employee {
    private int id;
    private String name;
    private int age;
    private double salary;
    public Employee() {
    }
    public Employee(int id, String name, int age, double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    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;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public String getDetails(){
        return id + "\t" + name + "\t" + age + "\t" + salary;
    }
    @Override
    public String toString() {
        return getDetails();
    }
}


Programmer


Employee的子类,有自己的属型和方法


package com.caq.team.domain;


import com.caq.team.service.Status;


/**
 * @ClassName Programmer
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 11:17
 * @Version 1.0
 */
public class Programmer extends Employee {
    private int memberId;   //开发团队中的id
    private Status status = Status.FREE;
    private Equipment equipment;
    public Programmer() {
    }
    public Programmer(int id, String name, int age, double salary, Equipment equipment) {
        super(id, name, age, salary);
        this.equipment = equipment;
    }
    public int getMemberId() {
        return memberId;
    }
    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }
    public Status getStatus() {
        return status;
    }
    public void setStatus(Status status) {
        this.status = status;
    }
    public Equipment getEquipment() {
        return equipment;
    }
    public void setEquipment(Equipment equipment) {
        this.equipment = equipment;
    }
    @Override
    public String toString() {
        return getDetails() + "\t程序员\t" + status + "\t\t\t" + equipment.getDescription();
    }
    public String getTeamBaseDetails() {
        return memberId + "/" + getId() + "\t" + getName() + "\t" + getAge() + "\t" + getSalary();
    }
    //2/6  任志强    22 6800.0 程序员
    public String getDetailsForTeam() {
        return getTeamBaseDetails() + "\t程序员";
    }
}


Designer


同上


package com.caq.team.domain;


/**
 * @ClassName Designer
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 11:38
 * @Version 1.0
 */
public class Designer extends Programmer{
    private double bonus;//奖金
    public Designer() {
    }
    public Designer(int id, String name, int age, double salary, Equipment equipment, double bonus) {
        super(id, name, age, salary, equipment);
        this.bonus = bonus;
    }
    public double getBonus() {
        return bonus;
    }
    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
    @Override
    public String toString() {
        return getDetails() + "\t设计师\t" + getStatus() + "\t" + bonus + "\t\t" + getEquipment().getDescription();
    }
    public String getDetailsForTeam() {
        return  getTeamBaseDetails() + "\t设计师\t" + getBonus();
    }
}


Architect


package com.caq.team.domain;


/**
 * @ClassName Architect
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 11:41
 * @Version 1.0
 */
public class Architect extends Designer{
    private int stock;//股票
    public Architect() {
    }
    public Architect(int id, String name, int age, double salary, Equipment equipment, double bonus, int stock) {
        super(id, name, age, salary, equipment, bonus);
        this.stock = stock;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }
    @Override
    public String toString() {
        return getDetails() + "\t架构师\t" + getStatus() + "\t" + getBonus() + "\t" + stock + "\t" + getEquipment().getDescription();
    }
    public String getDetailsForTeam() {
        return getTeamBaseDetails() + "\t架构师\t" + getBonus() + "\t" + getStock();
    }
}


NameListService


package com.caq.team.service;
import com.caq.team.domain.*;
import static com.caq.team.service.Data.*;
/**
 * @ClassName NameListService
 * @Description 负责将data中的数据封装到Employee[]数组中,同时提供相关操作Employee[]的方法
 * @Author Jack
 * @Date 2021/11/8 11:46
 * @Version 1.0
 */
public class NameListService {
    private Employee[] employees;
    /**
     * 给employees及数组元素进行初始化
     */
    public NameListService() {
        //根据项目提供的Data类构建相应大小的employees数组
        //再根据Data类中的数据构建不同的对象,包括Employee、Programmer、Designer和Architect对象,以及相关联的Equipment子类的对象
        //将对象存于数组中
        //Data类位于com.caq.team.service包中
        employees = new Employee[EMPLOYEES.length];
        /**
         * 程序解析
         * 通过一个循环来获取数组中的信息
         * 用到了包装类的常用操作,以及常用的结构
         * 通过包装类的方法将字符转化为想要的基本数据类型,与前面定义的常量通过switch结构进行匹配,
         * 对应的数字代表一种对象类型(EMPLOYEE,PROGRAMMER,DESIGNER,ARCHITECT),不同的对象有不同装备的方法,
         * 也是用switch结构进行匹配,对应的数字有特殊的Equipment匹配过后返回一个Equipment对象作为
         * (EMPLOYEE,PROGRAMMER,DESIGNER,ARCHITECT)的参数一同加入数组employees中.
         * 最后提供了相关操作Employee[]的方法
         */
        for (int i = 0; i < employees.length; i++) {
            //获取员工信息
            int type = Integer.parseInt(EMPLOYEES[i][0]);
            //获取Employee的4个基本信息
            int id = Integer.parseInt(EMPLOYEES[i][1]);
            String name = EMPLOYEES[i][2];
            int age = Integer.parseInt(EMPLOYEES[i][3]);
            double salary = Integer.parseInt(EMPLOYEES[i][4]);
            Equipment equipment;
            double bonus;
            int stock;
            switch (type) {
                case EMPLOYEE:
                    employees[i] = new Employee(id, name, age, salary);
                    break;
                case PROGRAMMER:
                    equipment = createEquipment(i);
                    employees[i] = new Programmer(id, name, age, salary, equipment);
                    break;
                case DESIGNER:
                    equipment = createEquipment(i);
                    bonus = Double.parseDouble(EMPLOYEES[i][5]);
                    employees[i] = new Designer(id, name, age, salary, equipment, bonus);
                    break;
                case ARCHITECT:
                    equipment = createEquipment(i);
                    bonus = Double.parseDouble(EMPLOYEES[i][5]);
                    stock = Integer.parseInt(EMPLOYEES[i][6]);
                    employees[i] = new Architect(id, name, age, salary, equipment, bonus, stock);
                    break;
            }
        }
    }
    /**
     * 获取指定index上员工的位置
     *
     * @param index
     * @return
     */
    private Equipment createEquipment(int index) {
        //找到EQUIPMENT数组中的type和model类型,并把它转换为int类型
        int key = Integer.parseInt(EQUIPMENTS[index][0]);
        String modelOrName = EQUIPMENTS[index][1];
        switch (key) {
            case PC://21
                String display = EQUIPMENTS[index][2];
                return new PC(modelOrName, display);
            case NOTEBOOK://22
                double price = Double.parseDouble(EQUIPMENTS[index][2]);
                return new NoteBook(modelOrName, price);
            case PRINTER://23
                String type = EQUIPMENTS[index][2];
                return new Printer(modelOrName, type);
        }
        return null;
    }
    /**
     * 获取当前所有员工
     */
    public Employee[] getAllEmployees() {
        return employees;
    }
    /**
     * 获取指定ID的员工对象。
     * @param id
     * @return
     * @throws TeamException
     */
    public Employee getEmployee(int id) throws TeamException {
        for (int i = 0; i < employees.length; i++) {
            if (employees[i].getId() == id) {
                return employees[i];
            }
        }
        throw new TeamException("找不到指定的员工");
    }
}


status类


表示员工的状态


package com.caq.team.service;
/**
 * @ClassName Status
 * @Description 表示员工的状态
 * @Author Jack
 * @Date 2021/11/8 11:22
 * @Version 1.0
 */
public class Status {
    private final String NAME;
    private Status(String name) {
        this.NAME = name;
    }
    public static final Status FREE = new Status("FREE");
    public static final Status BUSY = new Status("BUSY");
    public static final Status VOCATION = new Status("VOCATION");
    //只能有get方法了,因为上面是常量
    public String getNAME() {
        return NAME;
    }
    @Override
    public String toString() {
        return NAME;
    }
}


TeamException


TeamException
package com.caq.team.service;
/**
 * @ClassName TeamException
 * @Description TODO
 * @Author Jack
 * @Date 2021/11/8 22:09
 * @Version 1.0
 */
public class TeamException extends Exception {
    static final long serialVersionUID = -3387514229948L;
    public TeamException() {
        super();
    }
    public TeamException(String msg) {
        super(msg);
    }
}


TeamService

关于开发团队成员的管理:添加、删除等。


package com.caq.team.service;
import com.caq.team.domain.Architect;
import com.caq.team.domain.Designer;
import com.caq.team.domain.Employee;
import com.caq.team.domain.Programmer;
import com.caq.team.service.Status;
import com.caq.team.service.TeamException;
/**
 * 关于开发团队成员的管理:添加、删除等。
 */
public class TeamService {
   private static int counter = 1;//给memberId赋值使用
   private final int MAX_MEMBER = 5;//限制开发团队的人数
   private Programmer[] team = new Programmer[MAX_MEMBER];//保存开发团队成员
   private int total;//记录开发团队中实际的人数
   public TeamService() {
      super();
   }
   /**
    * 获取开发团队中的所有成员
    * @return
    */
   public Programmer[] getTeam(){
      Programmer[] team = new Programmer[total];
      for(int i = 0;i < team.length;i++){
         team[i] = this.team[i];
      }
      return team;
   }
   /**
    * 将指定的员工添加到开发团队中
    * @param e
    * @throws TeamException
    */
   public void addMember(Employee e) throws TeamException {
//    成员已满,无法添加
      if(total >= MAX_MEMBER){
         throw new TeamException("成员已满,无法添加");
      }
//    该成员不是开发人员,无法添加
      if(!(e instanceof Programmer)){
         throw new TeamException("该成员不是开发人员,无法添加");
      }
//    该员工已在本开发团队中
      if(isExist(e)){
         throw new TeamException("该员工已在本开发团队中");
      }
//    该员工已是某团队成员
//    该员正在休假,无法添加
      Programmer p = (Programmer)e;//一定不会出现ClassCastException
      if("BUSY".equalsIgnoreCase(p.getStatus().getNAME())){//if(p.getStatus().getNAME().equals("BUSY")){
         throw new TeamException("该员工已是某团队成员");
      }else if("VOCATION".equalsIgnoreCase(p.getStatus().getNAME())){
         throw new TeamException("该员正在休假,无法添加");
      }
//    团队中至多只能有一名架构师
//    团队中至多只能有两名设计师
//    团队中至多只能有三名程序员
      //获取team已有成员中架构师,设计师,程序员的人数
      int numOfArch = 0,numOfDes = 0,numOfPro = 0;
      for(int i = 0;i < total;i++){
         if(team[i] instanceof Architect){
            numOfArch++;
         }else if(team[i] instanceof Designer){
            numOfDes++;
         }else if(team[i] instanceof Programmer){
            numOfPro++;
         }
      }
      //正确的
      if(p instanceof Architect){
         if(numOfArch >= 1){
            throw new TeamException("团队中至多只能有一名架构师");
         }
      }else if(p instanceof Designer){
         if(numOfDes >= 2){
            throw new TeamException("团队中至多只能有两名设计师");
         }
      }else if(p instanceof Programmer){
         if(numOfPro >= 3){
            throw new TeamException("团队中至多只能有三名程序员");
         }
      }
      //错误的
//    if(p instanceof Architect && numOfArch >= 1){
//       throw new TeamException("团队中至多只能有一名架构师");
//    }else if(p instanceof Designer && numOfDes >= 2){
//       throw new TeamException("团队中至多只能有两名设计师");
//    }else if(p instanceof Programmer && numOfPro >= 3){
//       throw new TeamException("团队中至多只能有三名程序员");
//    }
      //将p(或e)添加到现有的team中
      team[total++] = p;
      //p的属性赋值
      p.setStatus(Status.BUSY);
      p.setMemberId(counter++);
   }
   /**
    * 判断指定的员工是否已经存在于现有的开发团队中
    * @param e
    * @return
    */
   private boolean isExist(Employee e) {
      for(int i = 0;i < total;i++){
         return team[i].getId() == e.getId();
      }
      return false;
   }
   /**
    *     从团队中删除成员
    */
   public void removeMember(int memberId) throws TeamException {
      int i = 0;
      for(;i < total;i++){
         if(team[i].getMemberId() == memberId){
            team[i].setStatus(Status.FREE);
            break;
         }
      }
      //未找到指定memberId的情况
      if(i == total){
         throw new TeamException("找不到指定memberId的员工,删除失败");
      }
      //后一个元素覆盖前一个元素,实现删除操作
      for(int j = i + 1;j < total;j++){
         team[j - 1] = team[j];
      }
      //写法一:
//    team[total-1] = null;
//    total--;
      //写法二:
      team[--total] = null;
   }
}


视图TeamView


package com.caq.team.view;
import com.atguigu.team.domain.Employee;
import com.atguigu.team.domain.Programmer;
import com.atguigu.team.service.NameListService;
import com.atguigu.team.service.TeamException;
import com.atguigu.team.service.TeamService;
import com.atguigu.team.view.TSUtility;
public class TeamView {
   private NameListService listSvc = new NameListService();
   private TeamService teamSvc = new TeamService();
   public void enterMainMenu(){
      boolean loopFlag = true;
      char menu = 0;
      while(loopFlag){
         if(menu != '1'){
            listAllEmployees();
         }
         System.out.print("1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):");
         menu = TSUtility.readMenuSelection();
         switch(menu){
         case '1':
            getTeam();
            break;
         case '2':
            addMember();
            break;
         case '3':
            deleteMember();
            break;
         case '4':
            System.out.print("确认是否退出(Y/N):");
            char isExit = TSUtility.readConfirmSelection();
            if(isExit == 'Y'){
               loopFlag = false;
            }
            break;
         }
      }
   }
   /**
    * 显示所有的员工信息
    * @Description 
    * @author shkstart
    * @date 2019年2月12日下午3:10:07
    */
   private void listAllEmployees(){
//    System.out.println("显示公司所有的员工信息");
      System.out.println("-------------------------------开发团队调度软件--------------------------------\n");
      Employee[] employees = listSvc.getAllEmployees();
      if(employees == null || employees.length == 0){
         System.out.println("公司中没有任何员工信息!");
      }else{
         System.out.println("ID\t姓名\t\t年龄\t\t工资\t\t职位\t\t状态\t\t奖金\t\t股票\t\t领用设备");
         for(int i = 0;i < employees.length;i++){
            System.out.println(employees[i]);
         }
      }
      System.out.println("-------------------------------------------------------------------------------");
   }
   private void getTeam(){
//    System.out.println("查看开发团队情况");
      System.out.println("--------------------团队成员列表---------------------\n");
      Programmer[] team = teamSvc.getTeam();
      if(team == null || team.length == 0){
         System.out.println("开发团队目前没有成员!");
      }else{
         System.out.println("TID/ID\t姓名\t年龄\t工资\t职位\t奖金\t股票\n");
         for(int i = 0;i < team.length;i++){
            System.out.println(team[i].getDetailsForTeam());
         }
      }
      System.out.println("-----------------------------------------------------");
   }
   private void addMember(){
//    System.out.println("添加团队成员");
      System.out.println("---------------------添加成员---------------------");
      System.out.print("请输入要添加的员工ID:");
      int id = TSUtility.readInt();
      try {
         Employee emp = listSvc.getEmployee(id);
         teamSvc.addMember(emp);
         System.out.println("添加成功");
      } catch (TeamException e) {
         System.out.println("添加失败,原因:" + e.getMessage());
      }
      //按回车键继续...
      TSUtility.readReturn();
   }
   private void deleteMember(){
//    System.out.println("删除团队成员");
      System.out.println("---------------------删除成员---------------------");
      System.out.print("请输入要删除员工的TID:");
      int memberId = TSUtility.readInt();
      System.out.print("确认是否删除(Y/N):");
      char isDelete = TSUtility.readConfirmSelection();
      if(isDelete == 'N'){
         return;
      }
      try {
         teamSvc.removeMember(memberId);
         System.out.println("删除成功");
      } catch (TeamException e) {
         System.out.println("删除失败,原因:" + e.getMessage());
      }
      //按回车键继续...
      TSUtility.readReturn();
   }
   public static void main(String[] args){
      TeamView view = new TeamView();
      view.enterMainMenu();
   }
}


测试类


package com.caq.team.junit;
import com.atguigu.team.service.TeamException;
import com.caq.team.domain.Employee;
import com.caq.team.service.NameListService;
import org.junit.Test;
/**
 * @ClassName NameListServiceTest
 * @Description 对NameList进行测试
 * @Author Jack
 * @Date 2021/11/8 22:16
 * @Version 1.0
 */
public class NameListServiceTest {
    @Test
    public void testGetAllEmployees(){
        //通过生成对象,调用构造方法会把Data类中的数据封装到Employee[]数组中
        NameListService service = new NameListService();
        //获取当前所有员工
        Employee[] employees = service.getAllEmployees();
        //遍历数组中所有的元素
        for (int i = 0; i < employees.length; i++) {
            System.out.println(employees[i]);
        }
    }
    @Test
    public void testGetEmployee(){
        com.atguigu.team.service.NameListService service = new com.atguigu.team.service.NameListService();
        int id = 1;
        id = 101;
        try {
            com.atguigu.team.domain.Employee employee = service.getEmployee(id);
            System.out.println(employee);
        } catch (TeamException e) {
            System.out.println(e.getMessage());
        }
    }
}


实现效果


-------------------------------开发团队调度软件--------------------------------
ID  姓名  年龄  工资  职位  状态  奖金  股票  领用设备
1 马云云 22  3000.0
2 马化腾 32  18000.0 架构师 FREE  15000.0 2000  联想T4(6000.0)
3 李彦宏 23  7000.0  程序员 FREE    戴尔(NEC17寸)
4 刘强东 24  7300.0  程序员 FREE    戴尔(三星 17寸)
5 雷军军 28  10000.0 设计师 FREE  5000.0  佳能 2900(激光)
6 任志强 22  6800.0  程序员 FREE    华硕(三星 17寸)
7 柳传志 29  10800.0 设计师 FREE  5200.0  华硕(三星 17寸)
8 杨元庆 30  19800.0 架构师 FREE  15000.0 2500  爱普生20K(针式)
9 史玉柱 26  9800.0  设计师 FREE  5500.0  惠普m6(5800.0)
10  丁磊磊 21  6600.0  程序员 FREE    戴尔(NEC 17寸)
11  张朝阳 25  7100.0  程序员 FREE    华硕(三星 17寸)
12  杨致远 27  9600.0  设计师 FREE  4800.0  惠普m6(5800.0)
-------------------------------------------------------------------------------
1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):2
---------------------添加成员---------------------
请输入要添加的员工ID:2
添加成功
按回车键继续...
-------------------------------开发团队调度软件--------------------------------
ID  姓名  年龄  工资  职位  状态  奖金  股票  领用设备
1 马云云 22  3000.0
2 马化腾 32  18000.0 架构师 BUSY  15000.0 2000  联想T4(6000.0)
3 李彦宏 23  7000.0  程序员 FREE    戴尔(NEC17寸)
4 刘强东 24  7300.0  程序员 FREE    戴尔(三星 17寸)
5 雷军军 28  10000.0 设计师 FREE  5000.0  佳能 2900(激光)
6 任志强 22  6800.0  程序员 FREE    华硕(三星 17寸)
7 柳传志 29  10800.0 设计师 FREE  5200.0  华硕(三星 17寸)
8 杨元庆 30  19800.0 架构师 FREE  15000.0 2500  爱普生20K(针式)
9 史玉柱 26  9800.0  设计师 FREE  5500.0  惠普m6(5800.0)
10  丁磊磊 21  6600.0  程序员 FREE    戴尔(NEC 17寸)
11  张朝阳 25  7100.0  程序员 FREE    华硕(三星 17寸)
12  杨致远 27  9600.0  设计师 FREE  4800.0  惠普m6(5800.0)
-------------------------------------------------------------------------------
1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):2
---------------------添加成员---------------------
请输入要添加的员工ID:3
添加成功
按回车键继续...
-------------------------------开发团队调度软件--------------------------------
ID  姓名  年龄  工资  职位  状态  奖金  股票  领用设备
1 马云云 22  3000.0
2 马化腾 32  18000.0 架构师 BUSY  15000.0 2000  联想T4(6000.0)
3 李彦宏 23  7000.0  程序员 BUSY    戴尔(NEC17寸)
4 刘强东 24  7300.0  程序员 FREE    戴尔(三星 17寸)
5 雷军军 28  10000.0 设计师 FREE  5000.0  佳能 2900(激光)
6 任志强 22  6800.0  程序员 FREE    华硕(三星 17寸)
7 柳传志 29  10800.0 设计师 FREE  5200.0  华硕(三星 17寸)
8 杨元庆 30  19800.0 架构师 FREE  15000.0 2500  爱普生20K(针式)
9 史玉柱 26  9800.0  设计师 FREE  5500.0  惠普m6(5800.0)
10  丁磊磊 21  6600.0  程序员 FREE    戴尔(NEC 17寸)
11  张朝阳 25  7100.0  程序员 FREE    华硕(三星 17寸)
12  杨致远 27  9600.0  设计师 FREE  4800.0  惠普m6(5800.0)
-------------------------------------------------------------------------------
1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):2
---------------------添加成员---------------------
请输入要添加的员工ID:4
添加成功
按回车键继续...
-------------------------------开发团队调度软件--------------------------------
ID  姓名  年龄  工资  职位  状态  奖金  股票  领用设备
1 马云云 22  3000.0
2 马化腾 32  18000.0 架构师 BUSY  15000.0 2000  联想T4(6000.0)
3 李彦宏 23  7000.0  程序员 BUSY    戴尔(NEC17寸)
4 刘强东 24  7300.0  程序员 BUSY    戴尔(三星 17寸)
5 雷军军 28  10000.0 设计师 FREE  5000.0  佳能 2900(激光)
6 任志强 22  6800.0  程序员 FREE    华硕(三星 17寸)
7 柳传志 29  10800.0 设计师 FREE  5200.0  华硕(三星 17寸)
8 杨元庆 30  19800.0 架构师 FREE  15000.0 2500  爱普生20K(针式)
9 史玉柱 26  9800.0  设计师 FREE  5500.0  惠普m6(5800.0)
10  丁磊磊 21  6600.0  程序员 FREE    戴尔(NEC 17寸)
11  张朝阳 25  7100.0  程序员 FREE    华硕(三星 17寸)
12  杨致远 27  9600.0  设计师 FREE  4800.0  惠普m6(5800.0)
-------------------------------------------------------------------------------
1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):1
--------------------团队成员列表---------------------
TID/ID  姓名  年龄  工资  职位  奖金  股票
1/2 马化腾 32  18000.0 架构师 15000.0 2000
2/3 李彦宏 23  7000.0  程序员
3/4 刘强东 24  7300.0  程序员
-----------------------------------------------------
1-团队列表  2-添加团队成员  3-删除团队成员 4-退出   请选择(1-4):


相关文章
|
6天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
18 4
|
8天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
29 4
|
11天前
|
NoSQL Java 调度
Java调度任务如何保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何保证相同任务在一个周期里只执行一次?
39 6
|
11天前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
29 1
|
13天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
14天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
31 2
|
14天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
16 1
|
7天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
8天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
21 0
WK
|
13天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
27 0