【问题标题】:classes calling other classes类调用其他类
【发布时间】:2012-07-02 19:26:27
【问题描述】:

我有一些课程。

在外观中,我有一个启动类,它被实例化并从那里调用所有方法。

然后我有汽车类、车主类、车库类和停车位类

所以... Starter 有一个 Car 属性。
汽车具有所有者属性。
汽车也有车库属性。
Garage 有一个 ParkingSpace 属性

Stater 类有一个 getOwner() 方法,它调用 Car 类中的 getOwner() 方法

private Car car;
public Starter (String name){
    car = new Car(new Owner(name);
}

上面的第三行实例化了 Car 和 Owner 对象。现在这允许我从各个类中调用各种方法。

我现在在 Starter Class 中有一个 addParking() 方法。 Starter 类的 addParking() 调用 Car 类的 addParking(),然后调用 GarageClass 的 addParking(),然后将停车位添加到存储在 Garage 类中的集合中。

我不明白的是...... 我现在如何实例化 Garage 对象以及我应该实例化它的什么? 我的 addParking() 方法适用于 Car,因为我有当我得到所有者时已经实例化了它。所以我现在不能去……

Car car = new Car(new Grarage(new ParkingSpace(int x, int y, int z)));

或者我可以吗?这不会创建一个全新的 Car 对象吗?

【问题讨论】:

  • 你为什么不在 Car 上调用一个添加车库的方法。

标签: java class instantiation composition


【解决方案1】:

我现在如何实例化 Garage 对象以及我要做什么 实例化它?

通常,当我遇到此类问题时,我会回到自然和我的领域模型。 Garage 类应该只与一个停车位相结合,因为 Garage 必须有一个停车位,但它可能没有 Car 或其中(还)。

public class Garage{
  public Garage(ParkingSpace parkingSpace){
     //...
  }
}

现在,您可以将Car 停在这个Garage 中,所以Garage 有一个方法是有意义的:

public void park(Car car){
}

现在可以通过以下方式链接这些代码:

Car car = new Car(owner);
Garage garage = new Garage(new ParkingSpace(...));
garage.park(car);

这不会创建一个全新的 Car 对象吗?

是的,Car car = new Car(new Grarage(new ParkingSpace(int x, int y, int z))); 将创建一个新的 CarGarage 和一个 ParkingSpace

【讨论】:

    【解决方案2】:

    如果您确定调用构造函数,您将创建一个新的 Garage 实例。我认为您最好保留默认构造函数,并为 Garage 提供 getter 和 setter 或 adder 方法(您的汽车是否存储在集合中?)以创建您的对象之间的关系:稍后您可以考虑哪些关系不能被破坏,擦除setter,通过构造函数创建关系。

       class Garage { 
    
        public Garage(){}
    
        private ParkingSpace ps;
    
        public void setParkingSpace(ParkingSpace ps){
          this.ps = ps;
        }
    
        public ParkingSpace getParkingSpace(){
          return ps;
        }
        public void addCar(Car car){
         // add  to some collection...
         }
        public void removeCar(Car car){
          // and remove...
         }
        }
    

    您的对象的生命周期似乎非常不同。 我会将 ParkingSpace 和 Park 与 Car 分开,并仅在需要时才与 setter 建立关系。 你需要考虑两件事: 1)我需要什么来创建一个对象?它还依赖于哪些其他对象? 2)你的关系是只读的还是读写的? 似乎您不需要公园来证明汽车。如果不是这种情况,请在拥有汽车之前创建公园,这是唯一的另一种方式。

        class ParkingSpace{
            private int x;
            private int y;
            private int z;
    
          public ParkingSpace(int x, int y,int z){
            this.x = x;
            this.y = y;
            this.z = z;
         }
    
         //... other methods
        }
    
        class  Park {
    
           private final List<ParkingSpace> parkingSpaces = new ArrayList<ParkingSpace>();
    
           public void addParkSpace(ParkingSpace ps){
             parkingSpaces.add(ps);
           }
           // other methods...
    
        }
         }
    
        class Car {
    
           private final Owner owner;
           private Park park;
           public Car(Owner o){
               this.owner = o;
           }
    
           public Owner getOwner(){
               return owner;
           }
    
           public Park getPark(){ return park}
           public void setPark(Park p){park = p}
    

    在你的代码中:

    Owner o = new Owner("John Doe");
    Car c = new Car(o);
    Park p = new Park();
    ParkingSpace ps = new ParkingSpace(1,2,3);
    p.addParkSpace(ps);
    car.setPark(p);
    

    【讨论】:

    • 只是澄清一下 - 我不是在添加和删除汽车。永远只有一辆车。我正在做的是在车库里增加停车位。并从车库中移除停车位。停车位和汽车之间的唯一关系是,汽车有一个与之相关的车库,而车库有可以从车库中添加和移除的停车位。我已经实例化了汽车和所有者。如何根据汽车实例化车库和停车位(以显示具有关系并调用它们的方法)
    • 对象的生命周期似乎非常不同。我会将 ParkingSpace 和 Park 与 Car 分开,并仅在您需要时与 setter 建立关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多