【发布时间】:2020-01-03 10:40:10
【问题描述】:
我正在用 Java 设计一个简单的酒店管理系统,但我的设计卡住了。
在我的主要功能中,我创建了 2 个房间和一个客人。我希望来宾班能够bookRoom 和一个房间来检查它是否isAvailable。
由于我没有使用任何数据库,我将房间存储在 HashMap 中,其中键是房间,值是布尔值,表示是否已预订。
我的房间类如何访问该哈希图?或者这是一种设计/思考问题的糟糕方式?
类似地,我的来宾类如何访问 bookRoom,它应该调用 isAvailable,这是一个 Room 方法。
任何建议将不胜感激!
客人
public class Guest {
String name;
boolean checkedIn;
public Guest(String name) {
this.name = name;
}
public void checkIn() {
setCheckedIn(true);
}
public void checkOut() {
setCheckedIn(false);
}
public boolean getStatus() {
return checkedIn;
}
public void setCheckedIn(boolean checkedIn) {
this.checkedIn = checkedIn;
}
public void bookRoom(String type) {
// check if room of type x is available
// if yes, create a guest booking
// if no, return
}
}
房间
public class Room {
public enum roomType {
ONE_BEDRM, TWO_BEDRM, THREE_BEDRM, PENTHOUSE
}
public int roomNum;
public double price;
public roomType type;
public Room(int roomNum, double price, roomType type) {
this.roomNum = roomNum;
this.price = price;
this.type = type;
}
public boolean isAvailable(Room room) {
boolean available = availability.get(room); // problem here obviously cause hashmap is defined in main
if (available) {
return true;
}
return false;
}
public int getRoomNumber() {
return roomNum;
}
}
主要
public static void main(String[] args) throws Exception {
Guest mike = new Guest("mike");
mike.checkIn();
mike.getStatus();
HashMap<Room, Boolean> availability = new HashMap<>();
Room one_bedroom1 = new Room(1001, 100.00, Room.roomType.ONE_BEDRM);
Room two_bedroom1 = new Room(2001, 200.00, Room.roomType.TWO_BEDRM);
availability.put(one_bedroom1, true);
availability.put(two_bedroom1, true);
}
==========================解决方案================== =======
感谢所有在 cmets 中提供帮助的人!以下是我现在按预期进行的编辑:
房间
public class Room {
public enum roomType {
ONE_BEDRM, TWO_BEDRM, THREE_BEDRM, PENTHOUSE
}
private boolean available;
private Guest occupant;
private int roomNum;
private double price;
private roomType type;
public Room(int roomNum, double price, roomType type) {
this.roomNum = roomNum;
this.price = price;
this.type = type;
}
public boolean isAvailable() {
return this.available;
}
public boolean getAvailable() {
return available;
}
public void setAvailable(boolean available) {
this.available = available;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public roomType getRoomType() {
return type;
}
public void setRoomType(roomType type) {
this.type = type;
}
public int getRoomNumber() {
return roomNum;
}
public void setRoomNumber(int roomNum) {
this.roomNum = roomNum;
}
public Guest getGuest() {
return occupant;
}
public void setGuest(Guest occupant) {
this.occupant = occupant;
}
}
客人
public class Guest {
private String name;
private boolean checkedIn;
private Room room;
public Guest(String name) {
this.name = name;
}
public void checkIn(Room room) {
if (this.getStatus() == false) {
this.setCheckedIn(true);
this.setRoom(room);
}
}
public void checkOut() {
if (this.getStatus() == true) {
this.setCheckedIn(false);
this.setRoom(null);
}
}
public boolean getStatus() {
return checkedIn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Room getRoom() {
return room;
}
public void setRoom(Room room) {
this.room = room;
}
public void setCheckedIn(boolean checkedIn) {
this.checkedIn = checkedIn;
}
public void getRoomInfo(Room room) {
System.out.println("Room # : " + room.getRoomNumber());
System.out.println("Room price : " + room.getPrice());
System.out.println("Room type : " + room.getRoomType());
System.out.println("Room occupant : " + room.getGuest().getName());
}
}
主要
public static void main(String[] args) throws Exception {
Guest mike = new Guest("mike");
Room one_bedroom1 = new Room(1001, 100.00, Room.roomType.ONE_BEDRM);
Room two_bedroom1 = new Room(2001, 200.00, Room.roomType.TWO_BEDRM);
one_bedroom1.setAvailable(true);
two_bedroom1.setAvailable(true);
System.out.println(one_bedroom1.isAvailable());
mike.checkIn(one_bedroom1);
one_bedroom1.setGuest(mike);
mike.getRoomInfo(one_bedroom1);
}
【问题讨论】:
-
为什么您的房间需要访问权限?
-
我会将 Room 存储在 HashMap 中,键是房间号,值是 Room 对象,我会设计 Room obj,如下所示:
class Room { private boolean isAvailable; private Guest occupant; private double dailyPrice; private RoomType roomType; /** all getters and setters */ }并且 Java 最佳实践也说明了使用 CamelCase 格式创建类。 (每个第一个字母单词的大写字母)如果您将可用性存储在对象本身中,则不需要从 Room 类访问 HashMap。 -
听起来像家庭作业 ;) 我认为可用性属于 Room 类本身。如果 hashmap 的目的是模拟数据库,那么创建一个专用的类“MockRoomDatabase”或类似的东西,你有一个唯一的键(最好使用计数器,因为房间号在现实世界中可能会改变)和值你有整个 Room 对象。您还需要提供与真实数据库中相同的访问方法(例如 putOne readOne、putMany、readMany、...)
-
还有一个建议:使用 Builder 生成 Room 对象:en.wikipedia.org/wiki/Builder_pattern#Java 构造函数中的 args 不应超过 2 个,而且真正的预订应用程序可能会有更多的房间参数.这将使以后的测试变得更加容易!
-
@asus 不要忘记默认将您的属性设为私有。在POO中,这是一个非常重要的概念,你会看到保护他的属性不被其他部分代码直接修改是非常有用的:)