嗨!
我当前项目中存在一个小设计问题。我有一个班级,其中包含客户在商店的时间信息。
public class Customer {
private String enterTime;
private String leaveTime;
public void enterTimeToInt {
Integer.parseInt(enterTime);
}
public void leaveTimeToInt {
Integer.parseInt(leaveTime);
}
}
现在,在我的计划中,我遇到了一种情况,我必须确保在给定时间内店内是否有客户。现在,我所做的是我创建了Customer类的另一个实例,它表示给定的时间,然后检查它是否与任何“真正的”客户匹配。但问题是,我创造了一个客户对象,以更抽象的方式代表时间,而不是客户。
在这种情况下我该怎么办?我需要与Customer类完全相同的方法和变量,但我不认为只是创建一个表示随机时间而不是特定客户时间的Customer类是一个很好的设计选择。
非常感谢!
答案 0 :(得分:6)
现在,我所做的是我创建了Customer类的另一个实例,它表示给定的时间,然后检查它是否与任何“真正的”客户匹配。
这不是你想要做的。
您要做的是一次检查每个客户,看看该时间是否在enterTime
和leaveTime
之间。
编辑回答这个问题:
我同意这个班级的名字很糟糕。该信息是关于客户的,因此我将其命名为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
和。{1}}
enterTime
为字符串。
使用leaveTime
方法,您可以循环浏览isVisit
个实例,查看CustomerVisit
访问过哪些客户或访问了多少客户。
givenTime
方法从文件中获取setVisit
,并将String
转换为String
个对象。
答案 1 :(得分:2)
您不应该为此问题需要新类型的客户。
当你说时间我认为你的意思是在一定范围内。我会做这样的事情:
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