在我的项目jOOQ中,我使用复杂的数据结构对SQL查询建模。查询的所有组件执行如何不公开Java中的公共接口
public interface QueryPart {
int bind(java.sql.PreparedStatement stmt);
int bind(java.sql.PreparedStatement stmt, int initialIndex);
SQLDialect getDialect();
String toSQLDeclaration();
String toSQLDeclaration(boolean inlineParameters);
String toSQLReference();
String toSQLReference(boolean inlineParameters);
}
此接口的方法在库的所有包内部用于构造和执行SQL。他们不应该直接从客户端代码中调用。为此,我添加了
public interface QueryPartProvider {
QueryPart getQueryPart();
}
这是唯一公开暴露的接口。实际查询部分的一个例子是:
public interface Table extends QueryPartProvider {}
class TableImpl implements QueryPart, Table {}
正如你所看到的,QueryPart方法只能通过Table.getQueryPart().toSQLDeclaration()
访问等
我的设计有利于QueryPart方法劝阻直接访问,但不能完全把它藏起来。我的问题是:任何人都可以告诉我一个好的设计模式来实现这个目标吗?
注意:最简单但不是很好的解决方案是将所有对象转换为QueryPart,例如, ((QueryPart) table).toSQLDeclaration()
为什么添加'getQueryPart'方法如果你想隐藏它? – Arne 2010-12-03 08:35:02
您可以尝试隐藏实现此接口的对象。这是你需要的吗? – 2010-12-03 08:42:35
@Arne:我想从客户端代码中隐藏它,但将它暴露给库。 @Stas:实现接口的对象是包私有的(参见TableImpl)。这些对象通过接口公开(参见表格) – 2010-12-03 08:46:18