A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马超 中级黑马   /  2012-5-22 20:36  /  1467 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

能运行出来,但是有点小错误啊,盯了半天了,也不知道是哪出了问题,求助啊!
下边是我的运行结果:
第1号的COMMON窗口开始获取普通任务!按说这里应该返回的是“普通”的,就是这
第2号的COMMON窗口开始获取普通任务!
第1号的VIP窗口正在获取任务
第3号的COMMON窗口开始获取普通任务!
第1号的EXPRESS窗口正在获取任务
第4号的COMMON窗口开始为3号普通客户服务
4号普通客户正在等待服务!
5号普通客户正在等待服务!
6号普通客户正在等待服务!
我感觉在ServiceWindow这个类中的
setType()这个方法当中,有点问题,它是怎么和枚举到那个类给关联起来的啊?
package com.itcast.band;
import java.util.ArrayList;
import java.util.List;
/*
* 编写表示号码管理器的类*/

public class NumberManager
{
        private int LastNumber = 1;
        /*产生一个号码就代表来了一位顾客,我们定义一个集合,将产生的号码我们都将他定义到一个集合当中去*/
        private List<Integer> queueNumber = new ArrayList<Integer>();
       
        /*所有客户把号都装到了这个方法当中去*/
        public synchronized Integer generateNewManager()
        {
                queueNumber.add(LastNumber);
                return LastNumber++;
        }
       
        public synchronized Integer fetchServiceNumber()
        {
                if(queueNumber.size()>0)
                {
                        return (Integer)queueNumber.remove(0);
                }
                else
                {
                        return null;
                }
        }
}


package com.itcast.band;
/*
* 编写表示号码机器的类*/

public class NumberMachine
{
        private NumberManager CommonManager = new NumberManager();
        private NumberManager ExpressManager = new NumberManager();
        private NumberManager VIPManager = new NumberManager();
        public NumberManager getCommonManager()
        {
                return CommonManager;  //注意看它的返回值是NumberManager类的成员,可以使用NumberManager当中的方法
        }
        public NumberManager getExpressManager()
        {
                return ExpressManager;
        }
        public NumberManager getVIPManager()
        {
                return VIPManager;
        }
       
        /*定义一个单例模式:只能new一个对象*/
        private NumberMachine(){};
       
        private static NumberMachine instance = new NumberMachine();
       
        public static NumberMachine getInstance()
        {
                return instance;
        }
       
}


package com.itcast.band;
import java.util.Random;  //Random
import java.util.concurrent.Executors;
/*窗口前有 “第 ” xx 号
  客户前没有 “第” , 直接就是 xx号 客户
  
  有一个小问题: 各种类型用户的中文名称获取不到*/

public class ServiceWindow
{
        private CustomerTypes type = CustomerTypes.COMMON; //定义一个来表示是哪个窗口的服务类型 customerTypes  //默认值
        private int WindowId = 1;  //定义一个窗口号,在这里我们用到set方法而不是把它作为构造方法的参数,是为了提高代码的复用性。
       
        public void setType(CustomerTypes type)
        {
                this.type = type;
        }

        public void setWindowId(int windowId)
        {
                this.WindowId = windowId;
        }
       
       
        public void start()
        {
                Executors.newSingleThreadExecutor().execute(new Runnable()
                {
                        public void run()
                        {
                                /*
                                 * 取号
                                 * 从这里我们需要比较的if else和switch的区别
                                 * switch语句中的条件我们除了可以放int类型额之外我们还可以放enum枚举类型的*/       
                                while(true)
                                {
                                        switch(type)
                                        {       
                                       
                                        case COMMON:
                                                commonServers();
                                                break;
                                               
                                               
                                        case EXPRESS:
                                                expressServers();
                                                /*我们在这不再重新定义而是进行二次封装,将它搞成了一个内部类
                                                if(number!= null)
                                                {
                                                       
                                                }
                                                else
                                                {
                                                       
                                                }
                                               
                                                */
                                                break;
                                        case VIP:
                                                vipServer();
                                               
                                               
//                                                Integer number2 = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
//                                                if(number2 != null)
//                                                {
//                                                       
//                                                }
//                                                else
//                                                {
//                                                       
//                                                }
                                                break;
                                }
                                }
                        }
                               
                });
        }

                        private void commonServers()
                        {
                                String WindowName = "第" + WindowId + "号的"+ type + "窗口";
                                System.out.println(WindowName + "开始获取普通任务!");  //定义一个顺序,来判断是谁在获取任务
                                Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); //取号
                                if(number != null)
                                {
                                        System.out.println(WindowName+"开始为"+number+"号普通客户服务");
                                        long beginTime = System.currentTimeMillis();
                                        /*模拟服务:休息一段时间:
                                         * 在这里我们都定义成了int类型的了*/
                                        int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
                                        long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
                                        try
                                        {
                                                Thread.sleep(serverTime);  /*服务期间让它休息1 - 10 秒钟*/
                                        }
                                        catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                        long costTime = System.currentTimeMillis() - beginTime;
                                        System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" +  costTime/1000 + "秒");
                                }
                                else
                                {
                                        System.out.println(WindowName+"没有获取到任务,休息一秒钟");
                                        try
                                        {
                                                Thread.sleep(1000);  /*让它休息1秒钟*/
                                        } catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        }
                       
                        private void vipServer()
                        {
                                String WindowName = "第" + WindowId + "号的"+ type + "窗口";
                                System.out.println(WindowName + "正在获取任务");   //定义一个顺序,来判断是谁在获取任务
                                Integer number = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
                                if(number != null)
                                {
                                        System.out.println(WindowName + "开始为第" + number + "号VIP客户服务");       
                                        long beginTime = System.currentTimeMillis();
                                        /*模拟服务:休息一段时间:
                                         * 在这里我们都定义成了int类型的了*/
                                        int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
                                        long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
                                        try
                                        {
                                                Thread.sleep(serverTime);  /*让它休息1 - 10 秒钟*/
                                        } catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                        long costTime = System.currentTimeMillis() - beginTime;
                                        System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" +  costTime/1000 + "秒");
                                }
                                else
                                {
                                        System.out.println(WindowName + "没有获取到VIP任务");
                                        commonServers();
                                        try
                                        {
                                                Thread.sleep(1000);  /*让它休息1秒钟*/
                                        } catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        }
                       
                        private void expressServers()
                        {
                                String WindowName = "第" + WindowId + "号的"+ type + "窗口";
                                System.out.println(WindowName + "正在获取任务"); //定义一个顺序,来判断是谁在获取任务
                                Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); //需要改动
                                if(number != null)
                                {
                                        System.out.println(WindowName + "开始为第" + number + "号快速客户服务");       
                                        long beginTime = System.currentTimeMillis();
                                        /*模拟服务:休息一段时间:
                                         * 在这里我们都定义成了int类型的了*/
                                        int maxRand = constants.MAX_SERVERS_TIME - constants.MIN_SERVER_TIME;
                                        long serverTime = new Random().nextInt(maxRand) + 1 + constants.MIN_SERVER_TIME;
                                        try
                                        {
                                                Thread.sleep(serverTime);  /*让它休息1 - 10 秒钟*/
                                        } catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                        long costTime = System.currentTimeMillis() - beginTime;
                                        System.out.println(WindowName + "为第" + number + "个" + type + "客户完成服务," + "耗时" +  costTime/1000 + "秒");
                                }
                                else
                                {
                                        System.out.println(WindowName + "没有获取到快速任务");
                                        commonServers();  //需要改动
                                        try
                                        {
                                                Thread.sleep(1000);  /*让它休息1秒钟*/
                                        } catch (InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        }
                       
                       
}


package com.itcast.band;

public enum CustomerTypes
{
        COMMON,EXPRESS,VIP;
       
        /*接下来我们来获取枚举里边的元素所对应的自定义元素*/
       
        public String toStirng()
        {
                String name = null;
                switch(this) // 是当前对象的话
                {
                case COMMON:
                        name = "普通";
                        break;
                case EXPRESS:
                        name = "快速";
                case VIP:
                        name =  name(); //我们直接返回的就是该枚举对象
                }
                return name;
        }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1 贴代码用代码模板

查看全部评分

2 个回复

倒序浏览
应该在枚举里面定义一个抽象方法,然后返回他的名字 比如“普通”
在看一遍视频,应该能透彻理解视频
回复 使用道具 举报
本帖最后由 麦田里的守望者 于 2012-5-22 22:09 编辑

估计是你的枚举类定义有问题
将枚举类改成这样试试
public enum CustomerType {
COMMON,QUICK,VIP;
public String toString(){
  
  switch(this){
  case COMMON:
   return "普通";
  case QUICK:
   return "快速";
  case VIP:
   return name();
   
  }
  return null;
   
}
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马