🙆

【Java】引数の渡し方

2024/01/31に公開

概要

ホテルの予約管理アプリを開発している。今回、問題があったのは以下の部分。

  • ホテル管理ユーザが、新規の部屋(部屋番号、部屋タイプ、料金)を追加
  • その際、上記三点の情報を渡す方法。

問題

具体的には下記コードで、どのようにこれらの情報を渡すべきかがわからなかった。

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