说,我想创建一个Validator
interface
或abstract class
- >我们的想法是,来自此implements
的{{1}}或extends
的每个类都应实现一个名为Validator
的方法
我的想法是,我只想调用validate(String input)
,这样我就不必创建验证器的实例。
但是,我无法在LastNameValidator.validate("McDonalds")
validate(String input)
或static
interface
的任何一种情况下制作Validator
abstract class
方法。 (在类加载时已经创建了多少cus静态方法?)
我也不关心使用Validator
或Singleton
Factory
或implement
extends
来制作实例,因为我认为不需要创建这样的实例只是为了调用静态方法
OOP / Java的做法是什么?
=============================================== ================================= 澄清:
我想在Validator
抽象类
public static abstract void validate(String input)
OR
我想在Validator
界面
public static void validate(String input)
但当然,这些语法无效。什么是不创建Validator实例的有效方法,但是这些静态方法是“覆盖”(或者说服我,我必须有一个这样的类的实例来调用仅仅Validator
方法?)< / p>
答案 0 :(得分:4)
使用静态方法肯定不是“非常”面向对象的。这就是为什么Java甚至不会编译一个源文件,其中static
和abstract
修饰符都附加到某个方法。因此,您在问题末尾发布的两个选项都不起作用。 (默认情况下,接口方法是抽象的,即使您没有显式添加修饰符)。
如果您不想使用单例(不确定原因),可以应用经典工厂模式,也可以结合定义包含所有可能验证器类型的枚举。这是一个随机的例子:
<强>枚举:强>
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");
答案 1 :(得分:4)
但当然,这些语法无效。什么是不创建Validator实例的有效方法,但这些静态方法是“覆盖”
这种气味XY problem,你可能会完全吠叫错误的树来解决这个问题。
我觉得正确的解决方案是创建一个实例,可能使用工厂,但不管你是怎么做的,都要创建一个实例。
你说:
我不关心这个类是静态的还是匿名的。当我不需要创建一个Validator时,我想不打扰验证器的一个实例(我想在我的脑海里,我认为这会在不需要时产生额外的数据/影响)
如果你没有通过创建实例来描述你的代码,并且没有发现它是一个内存或速度瓶颈,那么这就像是糟糕的过早优化。请理解编码的大部分成本都在调试和维护中。您建议创建难以维护的代码, 单元测试 ,并进行增强。对不起,但是如果你要制定违反OOP理念的限制,你最好有这样做的坚实基础。