这是我发现的一种通用方法。它允许在调用
this(...)或之前插入任何代码
super(...),从而克服Java的限制
this(...)或
super(...)成为构造函数中的第一条语句。
public class Test { private final int n; private final int m; private final int[] store; public Test(int n, int m) { // Primary constructor is unchanged this.n = n; this.m = m; store = new int[n]; // ... } private static class ConstrParams { private int nParam; private int mParam; private ConstrParams(Object data) { nParam = 1; mParam = 2; } } private Test(ConstrParams params) { this(params.nParam, params.mParam); // super(params.nParam, params.mParam); } public Test(Object data) { // Specific constructor. Now compiles successfully. this(new ConstrParams(data)); // ... further initialization }}优势包括:
- 调用构造函数的代码不受影响。这在使用时特别有用,
super(...)
因为对祖先类的更改通常是不希望的或不可能的。使用时this(...)
,上述方法不会影响任何依赖主构造函数的代码。 - 它不取决于调用的构造函数所需的参数数量。只需在
ConstrParams
类的字段中添加任意数量的它们,然后在调用主构造函数或继承的构造函数之前进行提取。如果参数是联合计算的(即,将其计算分为两个或更多个独立的方法是不可能的,或者是很昂贵的),则这种方法可以做到这一点。在某些情况下(经常是)被调用的构造函数不带任何参数,而您只需要在this(...)
或super(...)
调用之前在依赖的构造函数中执行一些操作(此类操作的一个示例是日志记录)。此解决方案使您可以执行此操作。 ConstrParams
产生参数和/或产生副作用的辅助类可用于其他目的。如果主类的一个以上辅助构造函数需要克服this(...)/super(...)
调用限制,则可以在其中引入更多构造函数。- 统一应用于
this(...)
和super(...)
调用。



