在我的项目jOOQ中,我使用复杂的数据结构为SQL查询建模。查询工具的所有组件
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 {}
如您所见,只能通过
Table.getQueryPart().toSQLDeclaration()
等访问QueryPart方法。我的设计有助于阻止直接访问QueryPart方法,但不能完全隐藏它。我的问题是:谁能告诉我一个好的设计模式来实现这一目标?
注意:最简单但不是很好的解决方案是将所有对象都转换为QueryPart,例如
((QueryPart) table).toSQLDeclaration()
最佳答案
接口的所有方法始终都是公共的,因此您无法访问库客户端也无法访问的内容。
也许您可以使用Table
的抽象类和getQueryPart()
方法作为包保护来实现所需的功能。但是我不确定是否要这样做,而不是从Table
转换为TableImpl
。
关于java - 如何不公开Java中的公共(public)接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4343717/