在我的程序中,我读取一个固定长度的文件,将每个字符串存储在一个局部变量中,然后将每个值存储到一个类类型数组列表中。为了创建数组列表的对象,我使用了包含所有变量的参数构造函数。以下代码演示了这一点。
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个变量)
答案 0 :(得分:7)
这取决于课程的使用方式。
例如,不可变类将需要一个带参数的构造函数,而不需要setter。
但 Java Bean 需要一个无参数的构造函数和setter。
需要考虑的一些事项:
答案 1 :(得分:2)
我是否对类变量使用访问器和变换器取决于两件事:
final
。在我看来,必要和最终的变量应该在构造函数中,并且不应该有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。进行这些更改有一个重要的例外。这是当您明确不希望从被调用对象创建对较大对象的依赖关系时。在这些情况下,解压缩数据并将其作为参数发送是合理的,但要注意所涉及的痛苦。如果参数列表太长或更改太频繁,则需要重新考虑依赖关系结构。