我对private字段与抽象类的private static字段的范围感到困惑。例如,考虑以下类别并注意字段validator

abstract class ValidComponent {
    private static Validator validator = ... //(statement to instantiate new Validator)

    /**
     *  This method is to be used by subclasses in their factory-methods
     *  to do some validation logic after instantiation.
     */
    protected void selfValidate() {
        //validation logic
        ...
        validator.validate(this); // <<< This line uses the validator
        ...
    }
}

class ValidUsername extends ValidComponent {

    private @NotEmpty String core;
    private ValidUsername(String unamestr) {
        this.core = unamestr;
    }

    /** This is the factory-method who use selfValidate() */
    public static ValidUsername create(String unamestr) {
        ValidUsername vuname = new ValidUsername(unamestr);
        vuname.selfValidate();
        return vuname;
    }
}

class ValidEmail extends ValidComponent {
    private @Email String core;
    private ValidEmail(String emailstr) {
        this.core = emailstr;
    }

    /** This is the factory-method who use selfValidate() */
    public static ValidEmail create(String emailstr) {
        ValidEmail vemail = new ValidEmail(emailstr);
        vemail.selfValidate();
        return vemail;
    }
}


抽象类ValidComponent准备方法selfValidate(),其中使用private static字段validator

ValidUsernameValidEmail是说明其基类意图的子类:方法selfValidate()用于其工厂方法中以对其进行验证。

如果我的理解是正确的,则在调用vuname.selfValidate()vemail.selfValidate()时,它们都使用相同的Validator对象,即ValidComponent.validator

但是,如果我碰巧将validator的修饰符从private static更改为仅privateValidorvuname.selfValidate()中使用的vemail.selfValidate()对象仍然是同一对象吗?

最佳答案

考虑一个私有变量,

private String name;


及其getter/setter当然是public

现在,每个类都可以访问getter / setter,该方法在其实现中使用私有变量。这就是私有变量的目的,而不是直接从其他类访问它。

您的情况与通过selfValidate()方法访问私有验证器的情况类似。通过其签名,子类可以访问selfValidate()

要回答有关验证器对象在非静态情况下是否会有所不同的问题,则访问它的每个类都将创建该对象的新实例。

10-06 06:33