【问题标题】:Way to Check Conditions in a Constructor在构造函数中检查条件的方法
【发布时间】:2014-12-21 17:25:45
【问题描述】:

这是我写的代码:

class Car
public Car(String Company,String Model,int Color,String FuelType,double Price,String Engine)
{
boolean  check =  ConstInitCheck(Company,FuelType,Engine,Color);
if((check))
{
this.Company = Company;
this.Model = Model;
this.Color = Color;
this.FuelType = FuelType;
this.Price = Price;
this.Engine = Engine;
}
else System.out.println("Sorry One of the Inputs were wrong! Please Try Again!");
}


public Car(String Company,String Model,int Color,String FuelType,double Price,String Engine,String VIP_Features)
{
boolean  check =  ConstInitCheck(Company,FuelType,Engine,Color);
if((check))
{
this.Company = Company;
this.Model = Model;
this.Color = Color;
this.FuelType = FuelType;
this.Price = Price;
this.Engine = Engine;
if(!VIP_Features.equals(""))this.VIP_Features = VIP_Features;
else this.VIP_Features="None";
}
else System.out.println("Sorry One of the Inputs were wrong! Please Try Again!");
}



private boolean ConstInitCheck(String Company,String FuelType,String Engine,int Color)
{
boolean a = ((Company.toUpperCase().equals("SUZUKI"))||(Company.toUpperCase().equals("TOYOTA"))||(Company.toUpperCase().equals("HYUNDAI"))||
(Company.toUpperCase().equals("VOLKSWAGEN"))||(Company.toUpperCase().equals("FORD"))||(Company.toUpperCase().equals("HONDA"))||(Company.toUpperCase().equals
("CHEVROLET"))||(Company.toUpperCase().equals("SKODA"))||(Company.toUpperCase().equals("FIAT")));
boolean b = ((FuelType.toUpperCase().equals("DIESEL"))||(FuelType.toUpperCase().equals("PETROL"))||(FuelType.toUpperCase().equals("GAS")));
boolean c = ((Engine.toUpperCase().equals("V2"))||(Engine.toUpperCase().equals("V4"))||(Engine.toUpperCase().equals("V6"))||(Engine.toUpperCase().equals("V8"))||

(Engine.toUpperCase().equals("V12")));
boolean d = Color >= 0 & Color <= 255;
boolean initcheck = a && b && c && d;
return initcheck;
}

我在这里读到的一些帖子反对在构造函数中执行方法,因为对象没有完全初始化。 但由于我调用的方法只检查输入的实际参数是否正确 这是正确的方法吗? 如果没有,请建议我这样做的最佳方法。 也欢迎对代码的其他方面提出建议或批评。

【问题讨论】:

  • 抛出异常而不是/除了使用System.out.println。如果对象构造不正确,您不希望调用代码尝试使用该对象,这在这里很容易发生。
  • 另外,ConstInitCheck 有什么作用?你没有向它传递任何参数,它在检查什么?
  • 我看到了,并编辑了代码
  • 好的,但是请您检查一下代码并完全编辑它吗?如果你问“我的代码可以改进吗”然后你一边编辑代码,那会浪费每个人的时间。是的,它可以改进,为什么不先改进它,然后问我们还有什么可以做的? (另外,请注意您有两次对 ConstInitCheck 的调用)
  • 你很抱歉。实际上这已经在我的代码中了,但是在创建帖子时我可能不小心删除了它。

标签: methods constructor initialization


【解决方案1】:

使用工厂方法。将检查移至方法和构造函数之外。 结果是一个有效的对象或根本没有对象。

    class Car{

       //private constructor to prevent creating objects from outside the factory method
       private Car(String Company,String Model,int Color,String FuelType,double Price,String Engine,String VIP_Features)
       {
          this.Company = Company;
          this.Model = Model;
          this.Color = Color;
          this.FuelType = FuelType;
          this.Price = Price;
          this.Engine = Engine;
       }

       //static method that creates the object after functional checks
       public static Car Create(String Company,String Model,int Color,String FuelType,double Price,String Engine,String VIP_Features)
       {
          if(ConstInitCheck(Company,FuelType,Engine,color)){
              return new Car(Company,Model,Color,FuelType,Price,Engine,VIP_Features);
          }
          return null; // or throw exception
       }

       private static boolean ConstInitCheck(String Company,String FuelType,String Engine,int Color){
          ...
       }

    }

用法:

var car = Car.Create(Company,Model,Color,FuelType,Price,Engine,VIP_Features);

【讨论】:

  • 感谢您的提示,我是 Java 新手,所以不知道设计模式是如何工作的。我会研究一下并尝试一下。
猜你喜欢
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2021-02-16
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多