我对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
。ValidUsername
和ValidEmail
是说明其基类意图的子类:方法selfValidate()
用于其工厂方法中以对其进行验证。如果我的理解是正确的,则在调用
vuname.selfValidate()
和vemail.selfValidate()
时,它们都使用相同的Validator
对象,即ValidComponent.validator
。但是,如果我碰巧将
validator
的修饰符从private static
更改为仅private
,Validor
和vuname.selfValidate()
中使用的vemail.selfValidate()
对象仍然是同一对象吗? 最佳答案
考虑一个私有变量,
private String name;
及其
getter/setter
当然是public
。现在,每个类都可以访问getter / setter,该方法在其实现中使用私有变量。这就是私有变量的目的,而不是直接从其他类访问它。
您的情况与通过
selfValidate()
方法访问私有验证器的情况类似。通过其签名,子类可以访问selfValidate()
。要回答有关验证器对象在非静态情况下是否会有所不同的问题,则访问它的每个类都将创建该对象的新实例。