如何面向对象 - 使用“静态”方法设计对象层次结构

时间:2014-03-04 22:10:17

标签: java oop

说,我想创建一个Validator interfaceabstract class - >我们的想法是,来自此implements的{​​{1}}或extends的每个类都应实现一个名为Validator的方法

我的想法是,我只想调用validate(String input),这样我就不必创建验证器的实例。

但是,我无法在LastNameValidator.validate("McDonalds") validate(String input)static interface的任何一种情况下制作Validator abstract class方法。 (在类加载时已经创建了多少cus静态方法?)

我也不关心使用ValidatorSingleton Factoryimplement extends来制作实例,因为我认为不需要创建这样的实例只是为了调用静态方法

OOP / Java的做法是什么?

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

我想在Validator抽象类

中执行public static abstract void validate(String input)

OR

我想在Validator界面

中执行public static void validate(String input)

但当然,这些语法无效。什么是不创建Validator实例的有效方法,但是这些静态方法是“覆盖”(或者说服我,我必须有一个这样的类的实例来调用仅仅Validator方法?)< / p>

2 个答案:

答案 0 :(得分:4)

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

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

<强>枚举:

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理念的限制,你最好有这样做的坚实基础。