🙆
【Java】引数の渡し方
概要
ホテルの予約管理アプリを開発している。今回、問題があったのは以下の部分。
- ホテル管理ユーザが、新規の部屋(部屋番号、部屋タイプ、料金)を追加
- その際、上記三点の情報を渡す方法。
問題
具体的には下記コードで、どのようにこれらの情報を渡すべきかがわからなかった。
System.out.println("Enter room number");
String roomNumber = scanner.nextLine();
System.out.println("Enter price per night");
String pricePerNighe = scanner.nextLine();
System.out.println("Enter room type: 1 for sigle bed, 2 for double bed");
String roomType = scanner.nextLine();
System.out.println("Would you like to add another room y/n");
String anotherRooom = scanner.nextLine();
break;
やりたいこととしては、上記の部屋情報を下記のroomListに対して渡したい。正し、addRoom(IRoom roomId)とあったので、渡したい情報3つに対して一つしか渡せないので、どうすればいいんだ?と悩んでいた。
public class ReservationService {
private ArrayList<IRoom> roomList = new ArrayList<>();
private ArrayList<Reservation> reservations = new ArrayList<Reservation>();
public void addRoom(IRoom roomId) {
// ここで引数をIRoomにして渡せばいい
boolean roomExists = roomList.stream().anyMatch(room -> room.getRoomNumber().equals(roomId));
if (!roomExists) {
roomList.add(roomId);
System.out.println("Room added successfully: " + roomId);
} else {
System.out.println("Room with number " + roomId + " already exists.");
}
}
解決策
結論、部屋番号、部屋タイプ、料金を含んだnewRoomを引数として渡せばいい。
解決策1
まず、RoomオブジェクトはIRoomインターフェースを実装している。
IRoomはこちら。
public interface IRoom {
String getRoomNumber();
Double getRoomPrice();
RoomType getRoomType();
boolean isFree();
}
RoomオブジェクトがIRoomインターフェースを実装しているのはこちら。
public class Room implements IRoom {
private String roomNumber;
private Double price;
private RoomType roomType;
public Room(String roomNumber, Double price, RoomType roomType) {
this.roomNumber = roomNumber;
this.price = price;
this.roomType = roomType;
}
そうすると、ユーザからroomNumber、price、roomTypeという情報を収集して、それらをnewRoomとして渡せばいい、となる。
System.out.println("Enter room number");
String roomNumber = scanner.nextLine();
System.out.println("Enter price per night");
double price = Double.parseDouble(scanner.nextLine());
System.out.println("Enter room type: 1 for single bed, 2 for double bed");
int typeInput = Integer.parseInt(scanner.nextLine());
RoomType roomType = (typeInput == 1) ? RoomType.SINGLE : RoomType.DOUBLE;
Room newRoom = new Room(roomNumber, price, roomType);
adminResource.addRoom(newRoom);
解決策2
次に、addRoom側の引数をnewRoomとすること。元々はroomIdでわかりにくかった。
public void addRoom(IRoom roomId) {
// ここで引数をIRoomにして渡せばいい
boolean roomExists = roomList.stream().anyMatch(room -> room.getRoomNumber().equals(roomId));
if (!roomExists) {
roomList.add(roomId);
System.out.println("Room added successfully: " + roomId);
} else {
System.out.println("Room with number " + roomId + " already exists.");
}
}
roomIdというより、部屋番号、部屋タイプ、料金という三つの情報を渡す必要があるので、newRoomという引数に置き換える。
public void addRoom(IRoom newRoom) {
boolean roomExists = roomList.stream().anyMatch(room -> room.getRoomNumber().equals(newRoom.getRoomNumber()));
if (!roomExists) {
roomList.add(newRoom);
System.out.println("Room added successfully: " + newRoom);
} else {
System.out.println("Room with number " + newRoom.getRoomNumber() + " already exists.");
}
}
解決策3
roomListを静的フィールドに書き換えること。元々は、staticという文言がなく、非静的フィールドとして扱われていた。
private ArrayList<IRoom> roomList = new ArrayList<>();
そうすると、ReservationServiceの新しいインスタンスが生成されるたびに、新しいroomListが作成されて、以前のインスタンスで追加された部屋情報が失われてしまう。そのため、以下のように変更する。
private static ArrayList<IRoom> roomList = new ArrayList<>();
Discussion