繁体   English   中英

Java中的2个相同的类

[英]2 identical classes in Java

嗨!

我当前的项目中有一个小设计问题。 我有一门课程,其中包含有关客户在商店中的时间的信息。

public class Customer {
    private String enterTime;
    private String leaveTime;

    public void enterTimeToInt {
        Integer.parseInt(enterTime);
    } 

    public void leaveTimeToInt {
        Integer.parseInt(leaveTime);
    } 
}

现在,在我的程序中,我遇到了一种情况,我必须确保在给定时间商店中是否有任何客户。 现在,我所做的是我制作了Customer类的另一个实例,该实例表示给定的时间,然后检查它是否与任何“真实” Customer相匹配。 但是问题是,我使客户对象更抽象地表示了时间,而不是客户。

在这种情况下我该怎么办? 我需要与Customer类完全相同的方法和变量,但是我认为仅使Customer类代表随机时间而不是特定客户的时间不是一个好的设计选择。

非常感谢你!

现在,我所做的是我制作了Customer类的另一个实例,该实例表示给定的时间,然后检查它是否与任何“真实” Customer相匹配。

那不是你想做的。

您要做的是遍历每个客户一次,看看该时间是否介于enterTimeleaveTime之间。

编辑以回答问题:

我同意班名不好。 该信息与客户有关,因此我将其命名为CustomerVisit

您的CustomerVisit类应如下所示:

import java.util.Calendar;

public class CustomerVisit {
    private Calendar enterTime;
    private Calendar leaveTime;


    public Calendar getEnterTime() {
        return enterTime;
    }

    public void setEnterTime(Calendar enterTime) {
        this.enterTime = enterTime;
    }

    public Calendar getLeaveTime() {
        return leaveTime;
    }

    public void setLeaveTime(Calendar leaveTime) {
        this.leaveTime = leaveTime;
    }

    public boolean isVisit(Calendar givenTime) {
        if (givenTime.after(enterTime) && givenTime.before(leaveTime)) {
            return true;
        } else {
            return false;
        }
    }

    public void setVisit(String visitString) {
        // File format is hh:mm-hh:mm
        String[] times = visitString.split("-");
        String[] enterTimeString = times[0].split(":");
        String[] leaveTimeString = times[1].split(":");

        enterTime = setCalendar(enterTimeString);
        leaveTime = setCalendar(leaveTimeString);
    }

    private Calendar setCalendar(String[] timeString) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 
                Integer.valueOf(timeString[0]));
        calendar.set(Calendar.MINUTE, 
                Integer.valueOf(timeString[1]));
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        return calendar;
    }
}

除了将时间存储为String ,您还需要将其存储在用于日期/时间计算的对象中,例如Calendar

我正在添加SimpleDateFormat以便可以将enterTimeleaveTime显示为字符串。

使用isVisit方法,您可以遍历CustomerVisit实例,并查看在给givenTime访问了哪些客户或多少客户。

setVisit方法从文件中获取String ,并将String转换为Calendar对象。

您不需要新的客户类型来解决此问题。

当您说时间时,我想您的意思是在一定范围内。 我会做这样的事情:

public class CustomerRange  
{  
     Collection<Customer> customers;  

     ...   

     public boolean customerInShop(Date time)  
     {  
            for(Customer customer : customers)  
            {  
                  if(customer.getStart().after(time) && customer.getEnd().before(time))  
                  {
                      return true;
                  }  
            }  
            return false;
     }   
}  

您需要像这样更新Customer类:

public class Customer  
{  
     Date start;  
     Date end;  
       ...
}  

从目前的情况来看,您有一个危险的API,一个无效的API:

public void enterTimeToInt {
        Integer.parseInt(enterTime);
    } 

其中一个不返回int,这是您最可能想做的。 同样,您也没有针对enterTime不是有效整数的情况进行防御性编码。 此外,大多数日期被视为long

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM