需要许多输入参数的构造函数

15 浏览
0 Comments

需要许多输入参数的构造函数

我的问题涉及Java中的构造函数。我了解到我们应该尽量减少方法(包括构造函数)中的参数数量。那么如果我有一个需要大量输入参数才能创建的类,我该如何处理呢?我应该:\nA) 在构造函数方法签名中包含所有参数:\n示例:\n

public MyClass(SomeThing A, Vector v, OtherThing B, int number.. etc.){
      // 构造
}
..
MyClass c= new MyClass(..);
c.doSomethingWithAllYouGot();

\nB) 可以只构造很少的参数,然后要求对象使用者在调用特定方法之前添加参数\n

public MyClass(SomeThing A){
      // 构造
}
..
MyClass c=new MyClass(A);
c.attributeVector(v);
c.connectTo(B);
c.setNumber(n);
// etc.
c.doSomethingWithAllYouGot();

\n第二种方法似乎更加优雅和简洁,但如果类的使用不正确,容易出现错误。或者,如果一个类有太多输入参数,是否存在设计问题?

0
0 Comments

构造函数需要很多输入参数的问题通常是由于类的基本需求不同而引起的。如果"class"不能没有"Something A"(某个东西A),则将其作为主构造函数的参数。而如果"Otherthing B"(其他东西B)不是必需的,则可以将其作为默认参数,并通过其他方法进行设置。

解决方法一:将Something A作为主构造函数的参数

class MyClass:
    def __init__(self, something_a, otherthing_b=None):
        self.something_a = something_a
        self.otherthing_b = otherthing_b
        
# 创建对象时必须提供Something A的值
my_object = MyClass(something_a_value)
# 创建对象时可以提供Something A和Otherthing B的值
my_object = MyClass(something_a_value, otherthing_b_value)

解决方法二:将Otherthing B作为默认参数,并通过其他方法进行设置

class MyClass:
    def __init__(self, something_a):
        self.something_a = something_a
        self.otherthing_b = None
    
    def set_otherthing_b(self, otherthing_b):
        self.otherthing_b = otherthing_b
# 创建对象时必须提供Something A的值
my_object = MyClass(something_a_value)
# 创建对象后可以通过set_otherthing_b方法设置Otherthing B的值
my_object.set_otherthing_b(otherthing_b_value)

根据类的基本需求,可以根据以上两种解决方法中的一种或两种来解决构造函数需要很多输入参数的问题。

0
0 Comments

构造函数需要许多输入参数的问题是由以下原因导致的:

1. 构造函数的参数列表太长,这通常会使维护变得困难。例如,如果您希望传入5个字符串,用户几乎不可能在不查阅文档的情况下知道应该传递什么参数。

2. 在许多情况下这可能有效,但如果内部状态的一致性很重要,或者如果您希望使对象是不可变的,那么这可能不是一个好主意。

解决这个问题的常见方法有:

1. 使用Fluent Builder模式,代码如下:

MyClass c = new MyClassBuilder(A)
              .withAttributeVector(v)
              .connectTo(B)
              .withNumber(n)
              .create();

这样,复杂且不直观的构造函数调用可以被隐藏在构造器中。

2. 使用一个对象作为输入参数,代码如下:

public MyClass(MyClassConstructParam p){
}
..
MyClassConstructParam p = new MyClassConstructParam();
p.attributeVector(v);
p.connectTo(B);
p.setNumber(n);
MyClass c = new MyClass(p);

在此方法中,我们将输入参数封装在一个对象中,然后将该对象作为构造函数的参数传递。

Fluent Builder模式特别适用于不可变对象。在Builder模式中,对象本身只需要一个带有一个参数(即Builder本身)的受保护的构造函数。对象的构造函数直接读取Builder的属性,因此Builder和对象都不需要getter方法(Builder和对象已经紧密耦合,因此直接访问属性是有意义的)。

0
0 Comments

(Constructor requiring many input arguments)这个问题的出现的原因是类的构造函数需要太多的输入参数,可能表示这个类尝试同时做太多的事情。这提示我们可以将其拆分为更小的类。

解决方法有两种:

1. 将构造函数的访问权限设置为包私有,并在同一个包中使用构造器模式来实例化它。

2. 接受这个答案,因为它是最早的答案,并且建议了其他所有答案都提到的解决方法。

0