如何使用"static"方法设计对象层次结构



比方说,我想创建一个Validatorinterfaceabstract class->这个想法是Validator中的implementsextends的每个类都应该实现一个称为validate(String input)的方法

这个想法是,我只想调用LastNameValidator.validate("McDonalds"),这样我就不必创建验证器的实例。

然而,无论是在interfaceValidator还是abstract classValidator的情况下,我都不能使方法validate(String input)static。(在类加载时已经创建了静态方法吗?)

我也不想使用SingletonFactory创建implementextendsValidator的实例,因为我认为没有必要创建这样的实例来调用静态方法

OOP/Java的方法是什么?

================================================================================澄清:

我想在Validator抽象类中执行public static abstract void validate(String input)

我想在Validator接口中执行public static void validate(String input)

当然,这些在语法上是无效的。什么是不创建Validator实例但让这些静态方法被"覆盖"的有效方法(或者,说服我必须有这样一个类的实例才能调用static方法?)

使用静态方法肯定不是"非常"面向对象的。这就是为什么Java甚至不会编译一个staticabstract修饰符都附加到某个方法的源文件。因此,你在问题末尾发布的两个选项都不起作用。(默认情况下,接口方法是抽象的,即使您没有显式添加修饰符)。

如果您不想使用singleton(不确定为什么),您可以应用一个经典的工厂模式,也许可以结合定义一个包含所有可能的验证器类型的枚举。这里有一个随机的例子:

枚举:

public enum ValidatorType{
AGE,LAST_NAME;
}

工厂级

public class ValidatorFactory{
public static Validator getValidator(ValidatorType type){
if(ValidatorType.AGE.equals(type)){
return new AgeValidator(); //won't post the AgeValidator definition here
}
if(ValidatorType.LAST_NAME.equals(type)){
return new LastNameValidator(); //won't post the LastNameValidator definition here
}
return null;
}
}

客户端代码

ValidatorFactory.getValidator(ValidatorType.LAST_NAME).validate("Burger King");

,但当然,这些在语法上是无效的。什么是不创建Validator实例但让这些静态方法"覆盖"的有效方法

这闻起来有点XY问题的味道,你可能完全找错了树来解决这个问题。

我觉得正确的解决方案是创建一个实例,也许使用工厂,但不管你怎么做,都要创建一个例子。

您所在的州:

我不在乎这个类是静态的还是匿名的。当我不需要创建Validator的实例时,我不想麻烦它(我想在我的脑海里,我认为这会在不需要的情况下产生额外的数据/含义)

如果您没有通过创建实例来分析代码,也没有发现它是内存或速度瓶颈,那么这闻起来像是糟糕的过早优化。请理解,编码的大部分成本都在调试和维护中。您建议创建更难维护的代码,单元测试,并进行增强。抱歉,但是如果你要做出违背OOP哲学的限制,你最好有一个强有力的基础

最新更新