使用帮助程序私有方法初始化最终属性

时间:2011-12-06 12:48:15

标签: java properties final code-reuse

我在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给了我一个编译错误,因为类的属性是最终的,它们可能尚未初始化。

编辑: 请注意,我无法从第一行中的第二个构造函数调用,因为首先我需要进行一些计算,然后重用相关代码。

3 个答案:

答案 0 :(得分:3)

您发现了final的缺点: - )

Java必须确保在构造函数完成时初始化所有final个字段。由于各种其他限制,这意味着必须在构造函数的代码块内分配字段。

解决方法:

  1. 使用static辅助方法(根据设计,不依赖于班级的状态,因此也不依赖于final个字段。

  2. 使用构建器模式(将所有参数放在辅助类中,该类具有返回所需结果的build()方法。)

  3. 请勿使用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);
}

构造函数用于将对象初始化为有效状态。对于更复杂的处理,您可能希望添加静态创建方法。该方法甚至可能具有含义名称以指示它正在做什么。