【问题标题】:Passing arguments between classes in Java在 Java 中的类之间传递参数
【发布时间】:2022-06-26 09:45:57
【问题描述】:

我非常难于解决一个由正在测试的 java 包组成的练习,其中一些测试我发现无法通过。

包中有两个类别,即汽车和停车。它们之间的关系是一种聚合——Parking 是复合,Car 是组件:

Parking -parking (0...1)------- -cars(*) 汽车

-parking 和 -cars 是分别与类 Parking 和 Car 相关的属性。 -parking 属性可以有两个值,0 或 1,-cars 是一个未定义维度的数组。

一辆车可以分配到一个或没有一个停车位。同样,停车场是由数量不定的停车场组成的。

代码如下:

package package;

public class Parking {

    private String name; // Parking's name

    private String address; // Parking's address

    private int capacity; // Parking's capacity (number of cars can be parked in)

    private Car[] cars; // Array of cars that can be parked

    public Parking() { // Default constructor
        name = "Default parking";
        address = "59th Street";
        capacity = 10;
        cars = new Car[capacity];
    }

    public Car[] getCars() { // Getter of the array 'cars'
        return cars;
    }

    public int getFirstFreeParkingLot() { // Returns first free empty slot of the
                                         // array 'cars'. A car can be parked there.
                                         // Otherwise, returns -1
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        if (!b) return -1;
        else return i;
    }

    public void addCar (Car car) throws Exception { // Adds a car to a parking lot
        if (car == null) throw new Exception("[ERROR] The car cannot be null");
        else if (getParkingLotNumberByCar(car) != -1) throw new Exception("[ERROR] This car is already in this parking");
        else if (isFull()) throw new Exception("[ERROR] This parking is full");
        else if (getFirstFreeParkingLot() != -1) {
            cars[getFirstFreeParkingLot()] = car;
            car.setParking(car.getParking());
            }
    }

    public void removeCar (Car car) throws Exception { // remove a car from a parking 
                                                       // lot
        if(getParkingLotNumberByCar(car) != -1) {
            cars[getParkingLotNumberByCar(car)] = null;
            car.setParking(null);
            }
        else throw new Exception("[ERROR] This car does not exist in this parking");
    }

    public boolean isFull() { // Checks if the parking is full. 
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        return !b;
    }

    public boolean isFree() { // Checks if there's at least one empty parking lot
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        return b;
    }

    public boolean isEmpty() { // Checks if the entire parking lot is empty
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] != null) {
                b = true;
                break;
            }
        }
        return !b;
    }

    public int getParkingLotNumberByCar (Car car) { // Return the index of the array 
                                                    // 'cars' where the car given as
                                                    // argument is present in the 
                                                    // parking lot. Otherwise, returns -1
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == car) {
                b = true;
                break;
            }
        }
        if (!b) return -1;
        else return i;
    }

    public int getNumFreeParkingLots() { // Return the number of free parking lots in a parking
        int i;
        int n = 0;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) n++;
        }
        return n;
    }

}
package package;

import javax.management.ObjectName;
import java.time.LocalDate;
import java.util.Objects;
import java.util.UUID;

public class Car {

    private Parking parking;

    public Car() {
        parking = null;
    }

    public Parking getParking() {
        return parking;
    }

    public void setParking(Parking parking) throws Exception {
        if (parking == null)
            this.parking = null;
        else {
            parking.addCar(parking.getCars()[parking.getParkingLotNumberByCar(new Car())]);
            if (this.parking != parking) this.parking.removeCar(parking.getCars()[parking.getParkingLotNumberByCar(new Car())]);
        }
    }
}

下面是一个我没有通过的测试:

package package;

import org.junit.jupiter.api.*;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.TestInstance.Lifecycle;

import static org.junit.jupiter.api.Assertions.*;

@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(OrderAnnotation.class)
class IntegrationTest {
    Parking parking1;
    Car car1;
    
    @BeforeAll
    void init(){
        try {
            parking1 = new Parking();
            car1 = new Car();
        } catch (Exception e) {
            e.printStackTrace();
            fail("Init failed");
        }
    }

    @Test
    @Order(1)
    void testIntegration1() {
        try {
            parking1.addCar(car1);
            assertEquals(0, parking1.getParkingLotNumberByCar(car1));
            assertEquals(9, parking1.getNumFreeParkingLots());
            assertEquals(1, parking1.getFirstFreeParkingLot());
            assertEquals(car1, parking1.getCars()[parking1.getParkingLotNumberByCar(car1)]);
            assertEquals(parking1, car1.getParking());
        } catch (Exception e) {
            e.printStackTrace();
            fail("Integration1 failed");
        }
    }

使用 Car 类中的 setParking (Parking 停车) 方法和 Parking 类中的 addCar (Car car) 和 removeCar (Car car) 方法时,关键部分就出现了。 Car 类中的 setParking 方法建立了属性 parking 并调用了 Parking 类的 addCar 和 remove Car 方法,依次添加和移除停车场中的汽车,最后调用上面提到的 setParking 方法。

我可以将汽车添加到停车场,但我未能将停车场信息添加到该汽车。

要引用 Car 类中的 Car 对象,我使用“new Car”,而当涉及到 Parking 类时,我使用“new Parking”。我的操作正确吗?

我失败的所有测试都与上述这些方法的不成功交织有关 -parking.addCar、parking.removeCar、car.setParking。

有人可以帮我吗?

非常感谢您

【问题讨论】:

  • 你打电话给car.setParking(car.getParking()) 这没有多大意义。您可能需要将其设置为检索到的停车位。但是:setParking 需要 Parking 并且 似乎重复(很难说)停车过程。只有一个班级负责停车。

标签: java class arguments


【解决方案1】:

public class Parking {

    private String name; // Parking's name

    private String address; // Parking's address

    private int capacity; // Parking's capacity (number of cars can be parked in)

    private Car[] cars; // Array of cars that can be parked

    public Parking() { // Default constructor
        name = "Default parking";
        address = "59th Street";
        capacity = 10;
        cars = new Car[capacity];
    }

    public Car[] getCars() { // Getter of the array 'cars'
        return cars;
    }

    public int getFirstFreeParkingLot() { // Returns first free empty slot of the
                                         // array 'cars'. A car can be parked there.
                                         // Otherwise, returns -1
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        if (!b) return -1;
        else return i;
    }

    public void addCar (Car car) throws Exception {
        if (car == null) throw new Exception("[ERROR] The car cannot be null");
        else if ((getParkingLotNumberByCar(car) != -1)) throw new Exception("[ERROR] This car is already in this parking");
        else if (isFull()) throw new Exception("[ERROR] This parking is full");
        else if (isFree()) {
            cars[getFirstFreeParkingLot()] = car;
            car.setParking(this);
            }
    }

    public void removeCar (Car car) throws Exception {
        if(getParkingLotNumberByCar(car) != -1) {
            cars[getParkingLotNumberByCar(car)] = null;
            car.setParking(null);
            }
        else throw new Exception("[ERROR] This car does not exist in this parking");
    }

    public boolean isFull() { // Checks if the parking is full. 
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        return !b;
    }

    public boolean isFree() { // Checks if there's at least one empty parking lot
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) {
                b = true;
                break;
            }
        }
        return b;
    }

    public boolean isEmpty() { // Checks if the entire parking lot is empty
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] != null) {
                b = true;
                break;
            }
        }
        return !b;
    }

    public int getParkingLotNumberByCar (Car car) { // Return the index of the array 
                                                    // 'cars' where the car given as
                                                    // argument is present in the 
                                                    // parking lot. Otherwise, returns -1
        int i;
        boolean b = false;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == car) {
                b = true;
                break;
            }
        }
        if (!b) return -1;
        else return i;
    }

    public int getNumFreeParkingLots() { // Return the number of free parking lots in a parking
        int i;
        int n = 0;
        for (i = 0; i < cars.length; i++) {
            if (cars[i] == null) n++;
        }
        return n;
    }

}
package package;

import javax.management.ObjectName;
import java.time.LocalDate;
import java.util.Objects;
import java.util.UUID;

public class Car {

    private Parking parking;

    public Car() {
        parking = null;
    }

    public Parking getParking() {
        return parking;
    }

    public void setParking(Parking parking) throws Exception {
        if (parking != null) {
            if (parking.getParkingLotNumberByCar(this) == -1) {
                    parking.addCar(this);
            }
            if (this.parking != null && this.parking != parking) {
                        this.parking.removeCar(this);
                    }
            this.parking = parking;
                }
        else {
            if (this.parking != null) {
                if (this.parking.getParkingLotNumberByCar(this) != -1)
                    this.parking.removeCar(this);
            }
            this.parking = null;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多