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
。不同的是,它们有额外的功能。。让我知道我是否应该以其他方式处理此事