具有最终未初始化字段的抽象类

我想知道下面的代码是否有意义,因为编译器警告“空白的最终字段对象可能没有被初始化”。 有没有更好的方法来做到这一点?

public abstract Test { protected final ArrayList<Object> objects; } public TestSubA extends Test { public TestSubA() { objects = new ArrayList<Objects>(20); // Other stuff } } public TestSubB extends Test { public TestSubB() { objects = new ArrayList<Objects>(100); // Other stuff } } 

我会做出最后的决定,强制构造函数传递值:

 public abstract class Test { private final ArrayList<Object> objects; protected ArrayList<Object> getObjects() { return objects; } protected Test(ArrayList<Object> objects) { this.objects = objects; } } public class TestSubA extends Test { public TestSubA() { super(new ArrayList<Object>(20)); // Other stuff } } public class TestSubB extends Test { public TestSubB() { super(new ArrayList<Object>(100)); // Other stuff } } 

直接在子类的构造函数中初始化最终参数的问题是,因为super()必须是构造函数的第一个语句,所以需要在一行中完成所有操作。 所以相反,我更喜欢使构造函数非公开,并像这样做一个静态构build方法:

 public abstract class Test { protected final ArrayList<Object> objects; protected Test(ArrayList<Object> objects) { this.objects = objects; } } public class TestSubA extends Test { public static TestSubA build() { ArrayList<Object> objects = new ArrayList<Object>(20); objects.put(...); // Other stuff return new TestSubA(objects); } private TestSubA(ArrayList<Object> objects) { super(objects); } } 

实例化抽象类构造函数中的对象,并将差异传递给该构造函数。

一般来说,在基类中有一个总是设置字段的构造函数可能会更好,并且没有一个默认的构造函数没有设置它。 然后子类可以使用super(value)参数在构造函数的第一行显式传递参数,