没有arg构造函数或arg构造函数

时间:2016-02-12 18:32:11

标签: java constructor

在我的程序中,我读取一个固定长度的文件,将每个字符串存储在一个局部变量中,然后将每个值存储到一个类类型数组列表中。为了创建数组列表的对象,我使用了包含所有变量的参数构造函数。以下代码演示了这一点。

String a = "text1";
String b = "text2";
SampleModel sm = new SampleModel(a,b);
ArrayList<SampleModel> sampleList = new ArrayList<>();
sampleList.add(sm);

我觉得这绝对正确,但是我的同事让我把它改成一个没有arg的构造函数,而是调用getter和setter。那就像下面一样。

SampleModel sm = new SampleModel();
ArrayList<SampleModel> sampleList = new ArrayList<>();
String a = "text1";
String b = "text2";
sm.setA(a);
sm.setB(b);
sampleList.add(sm);

有没有理由更喜欢没有arg构造函数而不是参数构造函数? (我的程序有大约15个变量)

5 个答案:

答案 0 :(得分:7)

这取决于课程的使用方式。

例如,不可变类将需要一个带参数的构造函数,而不需要setter。

Java Bean 需要一个无参数的构造函数和setter。

需要考虑的一些事项:

  • 封装可能很有价值。除了像JavaBeans这样的特殊情况外,通常可以根据所需的交互设计类的接口,而不是基于当前的数据成员集。
  • 方法具有名称。 Java不支持命名参数。方法名称在调用代码中传达如何使用实际参数。如果您的类具有多个参数,则通过方法传递它们可以产生更易读的调用代码。
  • 不可变类具有价值。如果您在类中直接添加命名setter,它将不会是不可变的。构建器模式允许您接受构造参数,即使对于不可变类也是如此。

答案 1 :(得分:2)

我是否对类变量使用访问器和变换器取决于两件事:

  1. 变量是对象必不可少还是可选。
  2. 是否可能在使用对象的过程中发生变化,或者是final
  3. 在我看来,必要和最终的变量应该在构造函数中,并且不应该有mutator。可选的变量应该具有访问器和增变器。必要但可能会发生变化的变量由您自行决定。我可能会把它们放在构造函数中,但是使用Builder设计模式来避免构造函数有很长的参数列表。

答案 2 :(得分:1)

带参数的构造函数主要是为了方便(尽管如果对象需要参数才能正确构造,并不总是如此,它在这里不再看到上下文);它与set方法正在做的完全相同。

没有理由没有构造函数接受参数,只要这些参数&#34;有意义&#34;在对象的上下文中。换句话说,它更像是一个语义学的东西而不是正确的东西。

如果构造函数是:

public SampleModel(String a, String b)
{
    this.a = a;
    this.b = b;
}

可能没有什么区别。

答案 3 :(得分:0)

可能只是因为有一个大的逗号分隔列表更容易看到发生了什么。这也许是使用Double Brace Initialization的好地方:

String a = "text1";
String b = "text2";
SampleModel sm = new SampleModel() {{
    setA(a);
    setB(b);
}};
ArrayList<SampleModel> sampleList = new ArrayList<>() {{
    add(sm);
}};

答案 4 :(得分:0)

Fowler和Beck的报价书:&#34;重构&#34;

  

长参数列表

     

在我们的早期编程日,我们被教导将参数传递给例程所需的所有参数。这是可以理解的,因为替代方案是全球数据,全球数据是邪恶的,通常是痛苦的。对象改变了这种情况,因为如果你没有你需要的东西,你可以随时要求另一个对象为你获取它。因此,对于物体,你不会传递方法所需的一切;相反,你传递足够的方法,以便该方法可以得到它需要的一切。方法的主机类可以使用很多方法。在面向对象的程序中,参数列表往往比传统程序小得多。这很好,因为长参数列表很难理解,因为它们变得不一致且难以使用,并且因为您需要更多数据而永远更改它们。通过传递对象可以消除大多数更改,因为您更有可能只需要生成几个请求来获取新数据。如果可以通过发出对已知对象的请求来获取一个参数中的数据,请使用“将参数替换为方法”。此对象可能是字段,也可能是其他参数。使用“保留整个对象”来获取从对象收集的大量数据,并将其替换为对象本身。如果您有多个没有逻辑对象的数据项,请使用Introduce Parameter Object。进行这些更改有一个重要的例外。这是当您明确不希望从被调用对象创建对较大对象的依赖关系时。在这些情况下,解压缩数据并将其作为参数发送是合理的,但要注意所涉及的痛苦。如果参数列表太长或更改太频繁,则需要重新考虑依赖关系结构。