Java 类设计查询

Java 类设计查询,java,design-patterns,Java,Design Patterns,我有一个接口Schema,还有一个叫做SchemaParser。 SimpleSchemaParser实现SchemaParser和SimpleSchema实现Schema SimpleSchemaParser有一个方法parseSchema(),该方法返回一个Schema。这样,SimpleSchemaParser.parseSchema()将返回一个Schema对象。但是我知道SimpleSchemaParser总是返回SimpleSchema。我应该如何改变我的设计以使这一点变得明显,而不

我有一个接口
Schema
,还有一个叫做
SchemaParser
SimpleSchemaParser
实现
SchemaParser
SimpleSchema
实现
Schema


SimpleSchemaParser
有一个方法
parseSchema()
,该方法返回一个
Schema
。这样,
SimpleSchemaParser.parseSchema()
将返回一个
Schema
对象。但是我知道
SimpleSchemaParser
总是返回
SimpleSchema
。我应该如何改变我的设计以使这一点变得明显,而不是总是将结果转换为
SimpleSchema
?在这种情况下,我应该使用泛型吗?

您确实可以使用泛型,但它们不是必需的:

class SchemaExample 
{
    interface Schema 
    {
        // methods go here
    }

    interface SchemaParser 
    {
        Schema parseSchema();
    }

    class SimpleSchema implements Schema 
    {
        // implementation of Schema's methods
    }

    class SimpleSchemaParser implements SchemaParser 
    {
        @Override
        public SimpleSchema parseSchema() 
        {
            // real business logic here...
            return new SimpleSchema();
        }   
    }

    void usage() 
    {
        SimpleSchema schema = new SimpleSchemaParser().parseSchema();
    }
}

一个稍微宽泛的问题是:为什么您关心返回哪个模式实现?是否存在仅存在于
SimpleSchema
上的方法?这些是否可以向上移动到接口
模式

自java 5以来,您可以返回SimpleSchema。这称为“协变返回类型重写”

那就写吧

class SimpleSchemaParser implements SchemaParser {
  @Override
  public SimpleSchema parseSchema() {...}
}

目前的做法是正确的。它鼓励面向接口的编程:程序应该始终与SchemaParser和Schema实体一起工作,而不必担心它是否基于SimpleSchema或其他类型。如果接口设计良好,则不需要强制转换:接口方法是后者应该使用/调用的唯一方法

SchemaParser parser = new SimpleSchemaParser()
Schema schema = parser.parseSchema()

+谢谢你问为什么。协变返回的使用并不一定有帮助,因为只有当解析器保存在类型为
SimpleSchemaParser
的变量中,而不是
SchemaParser
的变量中时,协变返回才会起作用。基于泛型的方法甚至可以从
SchemaParser
获得
SimpleSchema
(因为它是
SchemaParser
)。但是,为什么呢?协方差返回类型是java5中最重要的特性之一。有时使用这种结构非常方便,在这种情况下就是这样。在这种情况下,泛型没有得到很好的设计,因为需要构造一个新对象(它肯定会导致Class.newInstance或最差的java.lang.reflect)。感谢您的回复!我想我已经试过了。。协变返回类型非常好。为了回答您的问题,是的,我有不同的
schemaParser
,每个都可以返回不同的
Schema
。不同的是,它们有额外的功能。。让我知道我是否应该以其他方式处理此事