在我的项目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/

10-11 01:39