我在Java类中使用构造函数定义了几个最终属性,该构造函数具有初始化属性的所有信息。
public final class A {
private final Object prop1;
private final Object prop2;
public A(Object someObj, String prop1Str, String prop2Str) {
//initialize prop1 and prop2 based on information provided from someObj, prop1Str and prop2Str parameter (1)
}
}
我想在A类中引入一个带有以下签名和语义的新构造函数
public A(Object obj1, Object obj2, String prop1Str, String prop2Str) {
//use obj1 and obj2 to initialize the someObj
//initialize prop1 and prop2 based on information provided from someObj, prop1Str and prop2Str parameter (1)
}
如何重用(1)中的代码?我尝试使用帮助私有方法,但Java6给了我一个编译错误,因为类的属性是最终的,它们可能尚未初始化。
编辑: 请注意,我无法从第一行中的第二个构造函数调用,因为首先我需要进行一些计算,然后重用相关代码。
答案 0 :(得分:3)
您发现了final
的缺点: - )
Java必须确保在构造函数完成时初始化所有final
个字段。由于各种其他限制,这意味着必须在构造函数的代码块内分配字段。
解决方法:
使用static
辅助方法(根据设计,不依赖于班级的状态,因此也不依赖于final
个字段。
使用构建器模式(将所有参数放在辅助类中,该类具有返回所需结果的build()
方法。)
请勿使用final
。您可以通过省略setter来获得相同的事件。如果您担心类中的代码可能会更改字段,请将它们移动到新的基类。
答案 1 :(得分:0)
你应该致电this(obj1, prop1Str, prop2Str)
。这必须是第二个构造函数中的第一个可执行行。
答案 2 :(得分:0)
首先,你确定你的构造者没有失控吗?
如果您确定(现在)正在使用许多构造函数root,那么您可以从另一个构建函数中调用一个构造函数。需要成为构造函数usig this();
语法的第一行,它取代了隐式或显式super();
。
public A(Object obj, String prop1Str, String prop2Str) {
this(obj, obj, prop1Str, prop2Str);
}
public A(Object obj1, Object obj2, String prop1Str, String prop2Str) {
// ...
}
当然,您可以使用更复杂的表达式而不仅仅是普通的传入参数来转换参数。例如:
public A(Object obj, Object prop1Obj, String prop2Str) {
this(obj, maskNull(obj), String.valueOf(prop1Str), prop2Str);
}
构造函数用于将对象初始化为有效状态。对于更复杂的处理,您可能希望添加静态创建方法。该方法甚至可能具有含义名称以指示它正在做什么。