如何不在Java中公开公共接口

Luk*_*der 2 java design-patterns interface

在我的项目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);
}
Run Code Online (Sandbox Code Playgroud)

此接口的方法由库的所有包在内部使用,以构造和执行SQL.不应直接从客户端代码调用它们.为此,我补充说

public interface QueryPartProvider {
  QueryPart getQueryPart();
}
Run Code Online (Sandbox Code Playgroud)

这是唯一公开的界面.实际查询部分的示例是:

public interface Table extends QueryPartProvider {}
class TableImpl implements QueryPart, Table {}
Run Code Online (Sandbox Code Playgroud)

如您所见,QueryPart方法只能通过Table.getQueryPart().toSQLDeclaration()等方式访问.

我的设计有助于阻止对QueryPart方法的直接访问,但不能完全隐藏它.我的问题是:谁能告诉我一个好的设计模式来实现这个目标?

注意:最简单但不是很好的解决方案是将所有对象强制转换为QueryPart,例如 ((QueryPart) table).toSQLDeclaration()

Fla*_*vio 5

界面的所有方法都是公共的,因此您无法访问库客户端无法访问的内容.也许你可以使用抽象类来实现你想要的东西Table,并将getQueryPart()方法作为包保护.我不知道但是我会想这样做,而不是从铸造TableTableImpl.