【问题标题】:Call a different constructor depending on the static type of the instance created根据创建的实例的静态类型调用不同的构造函数
【发布时间】:2020-07-22 00:21:35
【问题描述】:

我有一个程序,其中类汽车实现了两个接口:可出租和可购买。

我的班级看起来像这样:

Class Car implements IRentable, IBuyable{
   private String name;
   private float rentValue;
   private float sellValue;

   //rentable constructor
   public Car(String name, float rentValue){
   ...
   }
   //buyable constructor
   public Car(String name, float buyValue){
   ...
   }
   ...
}

对象的实例化看起来像这样:

IRentable c1= new Car("name",700f);
IBuyable c2= New Car ("name",35_000f);

我想知道是否有一种方法可以根据对象的静态类型调用特定的构造函数。例如,如果我有 IRentable 类型:

IRentable c1= new Car("name",700f);

调用可出租的构造函数。 如果我有 IBuyable 类型:

IBuyable c2= New Car ("name",35_000f);

调用可购买的构造函数。

【问题讨论】:

    标签: java dynamic constructor interface static


    【解决方案1】:

    这是不可能的,因为不同的构造函数需要不同的方法签名。 你可以有一个带有标志的构造函数作为第三个参数:

    IRentable c1= new Car("name",700f,true);
    IBuyable c2= New Car ("name",35_000f,false);
    

    【讨论】:

      【解决方案2】:

      我认为对于这种情况,您应该考虑构建器模式,或者如果您只需要这两个构造函数,那么您可以将所有 args 构造函数设为私有,并创建两个相应地创建对象的静态方法。

      【讨论】:

        【解决方案3】:

        使用静态方法,可以命名以澄清区别。使构造函数private

        class Car implements IRentable, IBuyable {
            private String name;
            private float rentValue;
            private float buyValue;
        
            public static IRentable rent(String name, float rentValue) {
                return new Car(name, rentValue, Float.NaN);
            }
        
            public static IBuyable buy(String name, float buyValue) {
                return new Car(name, Float.NaN, buyValue);
            }
        
            private Car(String name, float rentValue, float buyValue) {
                ...
            }
        
            ...
        }
        

        它们是这样使用的:

        IRentable c1 = Car.rent("name", 700f);
        IBuyable c2 = Car.buy("name", 35_000f);
        

        【讨论】:

          【解决方案4】:

          您不能创建超过 1 个具有相同类型签名的构造函数。如果汽车只是假设为可出租或可购买,您可以创建一个单一界面,上述两个界面都可以像 Costable 一样扩展(我知道这个名字不好)。

          interface Costable {
              float amount();
          }
          

          然后组成一个 Costable 对象的 Car。

          class Car implements Costable {
          
              private final Costable;
          
              public Car(Costable costable) {
                  this.costable = costable;
              }
          
              @Override
              public float amount() {
                  return costable.amount();
              }
          }
          

          然后你可以用你的实现来扩展 Rentable/Buyable。这是一个像上面一样的 IRentable 示例。

          class IRentable implements Costable {
          
              private final float amount;
          
              public IRentable(float amount) {
                  this.amount = amount;
              }
          
              @Override
              public float amount() {
                  return amount;
              }
          }
          
          Costable rentable = new Car(new IRentable(1_000));
          

          【讨论】:

            猜你喜欢
            • 2013-03-05
            • 2016-03-02
            • 2014-10-02
            • 2011-05-08
            • 2012-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-19
            相关资源
            最近更新 更多