JAVA 多个构造函数和 IF 与继承

JAVA multiple constructors and IF's vs Inheritence

也许有人知道哪种方式编写代码更好(内存更少,CPU 或 GPU 最快)。

第一种方式: 为具有多个构造函数的所有实例编写一个 class 并 "IF's" 检查存在哪些参数?示例:

class SomeClass
{
  Parameter a;
  Parameter b;
  Parameter c;

   SomeClass(Parameter a)
  {
   this.a=a;
  }

 SomeClass(Parameter a,Parameter b)
  {
   this(a);
   this.b=b;
  }

   SomeClass(Parameter a,Parameter b,Parameter c)
  {
   this(a,b);
   this.c=c;
  }

public void method()
{
if(a!=null && b!=null && c!=null)
DO IN ONE WAY
if(a!=null && b!=null && c==null)
DO IN ANOTHER WAY
if(a!=null && b!=null && c==null)
DO IN ANOTHER WAY
if(a!=null && b==null && c==null)
DO IN ANOTHER WAY
...
    }
}

第二种方式: Extend parent class each time inherid parent class 当你需要使用更多参数时。示例:

   class SomeClass
    {
      protected Parameter a;

       SomeClass(Parameter a)
      {
       this.a=a;
      }
      public void method()
      {USE a parameter}
    }

    class SomeClass2 extends SomeClass
    {
      protected Parameter b;

       SomeClass2(Parameter a,Parameter b)
      {
       super(a);
       this.b=b;
      }
      public void method()
      {USE a and b parameter}
     }

请告诉我哪种方式更好,为什么?

我什至会提出第三种方式:

interface SomeClass
{
  public void method();
}

class SomeClassWithOneParameter implements SomeClass
{
  private Parameter a;

   SomeClassWithOneParameter(Parameter a)
  {
   this.a=a;
  }
  public void method()
  {USE a parameter}
 }

class SomeClassWithTwoParameters implements SomeClass
{
  private Parameter a;
  private Parameter b;

   SomeClassWithOneParameter(Parameter a,Parameter b)
  {
   this.a=a;
   this.b=b;
  }
  public void method()
  {USE a and b parameter}
 }

现在您可以使用类似工厂的模式从具体实现中抽象出您的代码:

class SomeClassFactory
{
    public SomeClass createSomeClassWithOneParam(Parameter a) 
    {
        return new SomeClassWithOneParameter(a);
    }

    public SomeClass createSomeClassWithTwoParams(Parameter a, Parameter b) 
    {
        return new SomeClassWithTwoParameters(a, b);
    }

}

继承的问题在于它是最难耦合的。想象一下,有一天,只有 a 参数的 class 过时了……您将不得不进行大量重构才能摆脱那个 class,只是因为您所有其他 [=26] =]es 取决于它...如果你需要一个只有参数 c 的 class,为什么要从参数 a 继承它?最好的共同点不应该基于字段(在你的情况下是参数),而是基于功能,那就是 method().

您提出的继承树的唯一优点是可以避免在 class 的不同实现中重复参数定义。然而,这没有性能差异,你只是少了一点编码,而且它比使用接口模式更不灵活。

关于你提出的第一种方法。它有一个问题,你最终会得到一个很大的 class,很可能由于太多原因而被修改。如果您在团队中工作,它可能会变成 class 每个人都必须根据每个需求进行修改,从而影响可维护性和可读性。

Robert Martin 的书 "Clean Code" 是不错的读物...