有没有办法在调用另一个构造函数时访问this.toString()的值?

ast*_*eri 5 java methods constructor instance

对于所有谈论对象处于"单元化状态"这一事实的人,请参考这个问题的答案,该问题表明可以传递对象引用,解除引用,从中调用方法,并访问字段构造函数终止并且已分配所有字段(包括 final字段)之前.

所以这是用例:

public class Entity {

    private final String name;

    public Entity() {
        this(toString()); //Nope, Chuck Testa
    }

    public Entity(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器错误是:

在显式调用构造函数时,不能引用实例方法.

请注意,toString()尚未覆盖,并且是默认调用Object.

我当然对这背后的哲学/技术原因感兴趣,所以如果有人能够解释,那将是一个很棒的奖金.但是我正在寻找一种toString()从默认构造函数调用的方法,因为它引用了具有更多参数的更具体的构造函数.实际的用例有点复杂,最终一直指向一个带有四个参数的构造函数,但这并不重要.

我知道我可以做这样的事......

private static final String TO_STRING_CONSTRUCTOR_ARGUMENT = "aflhsdlkfjlkswf";

public Entity() {
    this(TO_STRING_CONSTRUCTOR_ARGUMENT);
}

public Entity(String name) {
    this.name = name == TO_STRING_CONSTRUCTOR_ARGUMENT ? toString() : name;
}
Run Code Online (Sandbox Code Playgroud)

......但它似乎是一个非常不优雅的解决方案.

那么,还有什么方法可以把它拉下来?或者任何建议的最佳做法来处理这种情况?

Hap*_*ppy 0

您可以在类中使用静态方法工厂Entity,并将构造函数设为私有:

public class Entity {

    private String name;

    private Entity() {
    }

    public Entity(String name) {
        this.name = name;
    }

    public static Entity createEntity() {
        Entity result = new Entity();
        result.name = result.toString();
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会编译。您尝试在构造对象后分配“final”字段。另外,构造函数不会为该字段分配任何值,而它必须这样做。 (2认同)