繁体   English   中英

抽象类中的私有字段与私有静态字段

[英]private field vs private static field in abstract class

我对抽象类的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

但是,如果我发生改变的修饰什么validatorprivate staticprivate的, Validor中使用对象vuname.selfValidate()vemail.selfValidate()仍然是相同的对象?

不,他们不是。 static关键字表示该字段属于一个 这将是整个VM的单个实例。 如果没有static关键字,则该字段属于一个对象 ,因此ValidComponent的每个实例或其子类将产生一个新的Validator对象。

vuname.selfValidate()和vemail.selfValidate()中使用的Validor对象仍然是同一对象吗?

不可以,无论静态数据成员是否私有,都只能共享。 在这里, private static Validator validator = ... ValidComponent的数据成员,而private Validator validator = ...对象的数据成员,并且不能与另一个对象共享。

我不确定,但我认为对不同的对象使用相同的Validator不合适。 您的Valid*类不会共享相同的约束,因此会共享相同的验证错误。 共享同一对象可能会导致不一致。

您可以将private static更改为private ,但是从一开始您的设计就可能有问题。

也许工厂模式更适合您。

回答你的问题

还是同一个对象?

不,他们不是。

考虑一个私有变量,

private String name;

及其获取getter/setterpublic

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM