java - 类和方法对用户不可用,但对子包
问题描述
这个问题在这里被问过类似的问题:Java:子包可见性?
我目前的包结构是:
src/
| library/
| | InterfaceA.java
| | ClassB.java
| | provider/
| | | ClassofInterfaceA.java
| user/
| | UsageOfClassofInterfaceA.java
因此,ClassOfInterfaceA.java
使用方法来自ClassB.java
并实现Interface.java
.
我们创建了类的用户UsageOfClassOfInterfaceA.java
应该只能从 访问方法ClassOfInterfaceA.java
。他不应该能够从 Library 包中访问任何类/接口/变量或方法。
由于链接问题的答案更多地针对 junit 测试以及 IDE 如何使用这些测试,因此我找不到任何答案。
请不要推荐任何其他包结构,因为这是我们的讲师预定义的。
提前致谢 :)
编辑:因为已经被问到,所有课程目前都是公开的,因为我无法通过我的ClassOfInterfaceA.java
. 我还必须使用Java8。
为了解决工厂问题,ClassOfInterfaceA.java
UI 将使用 来演示它们的用法。所以UsageOfClassOfInterfaceA.java
本质上是一个 UI 类。
解决方案
首先,您最初的方法是错误的:类代表实现细节。因此,您希望您的用户完全依赖界面。因此,您应该公开该接口,而不是某个实现它的类。
因此,接口变为public,其他类变为私有或受包保护。从这个角度来看,你还可以组织你的文件/包布局:应该暴露的东西应该放在同一个地方。
您需要添加的另一件事:某种允许“用户”代码获取所述接口实例的工厂(如上所述,用户类不应该知道该实现类的名称,因此它不能做一个新的()调用自身)。
最后:您应该了解 Java 9 添加了模块概念,允许考虑更多选项。
推荐阅读
- flutter - 必须初始化不可为空的实例字段“_repository”
- mysql - MySQL中分层数据的节点数
- reactjs - React-Leaflet:位置未按时获取
- elasticsearch - 单索引或多索引
- python - 获得更灵活的函数柯里化的 Pythonic 配方
- haskell - 为什么 Haskell 中的这个“@”用法不能包含整个列表?
- python - Groupby 两列熊猫数据框和 shift().rolling()
- python - Python Ctypes NtQueryObject ObjectNameInformation 无异常中断
- python - 使用firebase admin SDK,Flask请求部署超时
- arrays - 使用二维数组作为转换表在 Verilog 中实现状态机