java私有数据的对外接口_java – 类中的私有接口

链接文章中的例子有点人为和​​人为(如奇数名称A,B等所示).但是,让我们关注您的问题引用的引用部分:

“…without adding any type information (that is, without allowing any upcasting).”

该类可以提供此接口的多个(公共或私有)实现.但关键是:

没有人能够弄清楚他们是否实现了这个界面.

简单来说,因为界面不公开.

我试图创建一个显示可能的应用案例的示例.当然,它仍然是人为的,但可能会更明显.考虑您要为树数据结构建模,该结构由Node对象组成.这些可以是InnerNode对象(具有子节点)或LeafNode对象(没有子节点).

这样的类可以像这样实现:

class Tree {

// The private interface

private interface Node {

List getChildren();

}

// Both are public implementations

public class InnerNode implements Node {

@Override

public List getChildren() {

return Arrays.asList(getLeafNode(), getLeafNode());

}

}

public class LeafNode implements Node {

@Override

public List getChildren() {

return Collections.emptyList();

}

}

// These return the concrete, public types

public InnerNode getInnerNode() { return new InnerNode(); }

public LeafNode getLeafNode() { return new LeafNode(); }

// This returns the private interface type

public Node getRootNode() {

// Both concrete types can be returned here,

// because they both implement the interface

return getInnerNode(); // Works

//return getLeafNode(); // Works

}

// This uses only the interface type

public void traverseNode(Node node) {

System.out.println("Traversing "+node);

for (Node child : node.getChildren()) {

traverseNode(child);

}

}

}

在外部main方法中,您可以观察私有接口施加的限制:

public static void main(String[] args) {

Tree tree = new Tree();

// The public concrete types can be used

Tree.LeafNode leafNode = tree.getLeafNode();

Tree.InnerNode innerNode = tree.getInnerNode();

// The private interface can not be used from outside:

//Tree.Node node = tree.getRootNode();

// This is possible: The class only uses its

// own private interface here

tree.traverseNode(tree.getRootNode());

}

在此示例中,您可以调用traverseNode,传入getRootNode返回的Node,无论此节点是InnerNode还是LeafNode.在当前版本中,这将打印出类似的内容

Traversing Tree$InnerNode

Traversing Tree$LeafNode

Traversing Tree$LeafNode

如果您更改了getRootNode以返回LeafNode,那么它只会打印

Traversing Tree$LeafNode

简单地说,并且正如名称“私有接口”已经暗示的那样:您可以使用它来隐藏两个类共享一个共同祖先的事实.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值