在java对象中进行构造函数更改时的最佳实践

时间:2016-05-16 08:52:49

标签: java design-patterns api-design

我有一个类,其中根据新的api集成添加了许多参数。

例如,早些时候我有一个包含4个参数的类:

Integer a;
String b;
Map<String, String> c;
List<Integer> e.

所以构造函数是:

public SampleClass(Integer a, 
                   String b, 
                   Map<String, String> c,      
                   List<Integer> e) 
{
    this.a = a;
    this.b = b;
    this.c = c;
    this.e = e;
}

在我们的代码中,有几个团队使用此构造函数与我的API集成。 过了一段时间,这个类中添加了一个新参数。即

Double d;

所以我添加了一个新的构造函数:

public SampleClass(Integer a,
                   String b,
                   Map<String, String> c,
                   List<Integer> e,
                   Double d)
{
    this.a = a;
    this.b = b;
    this.c = c;
    this.e = e;
    this.d = d;
}

我将之前的构造函数标记为已弃用。我没有删除以前的构造函数,因为如果删除,客户端的代码将会中断。

随着新参数的添加,我现在有了5个参数的构造函数。

是否有关于如何弃用/删除构造函数的最佳实践,以便不会发生这种情况?

3 个答案:

答案 0 :(得分:3)

从以下位置更改旧构造函数:

public SampleClass(Integer a, 
                   String b, 
                   Map<String, String> c,      
                   List<Integer> e) 
{
    this.a = a;
    this.b = b;
    this.c = c;
    this.e = e;
}

public SampleClass(Integer a, 
                   String b, 
                   Map<String, String> c,      
                   List<Integer> e) 
{
    //Zero is passed as a default value, but you can pass anything you want
    this(a,b,c,e,0);
}

通过这种方式,它将在新的引导下进行调用。

但是,您没有提供足够的信息,说明应该支持旧版本。如果它根本不应该,那么你应该从代码中删除它。这样,您将强制API的用户分析更改的内容并连接新的构造函数。

如果你不这样做,他们将继续使用旧版,因为程序员很懒惰: - )

答案 1 :(得分:0)

遵循Open/closed principle会很有帮助。您最初编写的类不应在需要新功能时进行修改,而应从其中派生另一个类以扩展其功能。

答案 2 :(得分:-2)

为什么不使用变量参数构造函数。这样你就可以将任意数量的参数传递给构造函数。

例如:

公共双倍平均值(双倍数字){

       double total = 0.0; // initialize total

      // calculate total using the enhanced for statement
      for ( double d : numbers )              
         total += d;                          

      return total / numbers.length;
   } // end method average