我正在开发一个库,其他程序员将导入并将其用于其目的。
我对Java访问修饰符的目标感到困惑。
问题是我有以下课程
ClassA
中的org.mylibrary
包裹ClassB
org.mylibrary.internal
ClassA需要解析ClassB,因此ClassB需要是公共类。
但是,从库用户视图来看,我并不打算在我的库外看到ClassB。因为它不应该也不需要由用户启动。
我想将ClassB移动到包org.mylibrary并使其成为package-private类。
如果我将它移动到同一个包中,那将是一个混乱而且难以组织,因为我在这个场景中有很多类,所以在一个大包中会有很多.java文件。
通常我将这些类放在按类别或图层分组的包中,我觉得它很容易组织。
我该怎么做?人们如何处理这个问题?
答案 0 :(得分:2)
由于您提供的关于ClassA
和ClassB
之间的角色和关系的信息很少,因此很难提供具体的建议。但是,一个通用解决方案(几乎总是用作消除依赖关系的一部分)是隐藏ClassB
接口。然后ClassA
仅使用该接口,因此它不再直接依赖于ClassB
。 ClassB
可以使包为私有,其实例由例如factory或dependency injected ClassA
。
答案 1 :(得分:1)
假设ClassB是一个带有单元测试的测试包:
为什么ClassB需要使用它。通常,测试类使用常规类,反之亦然。
通常,对测试类的建议是将它们放入与常规类相同的相同的包中,但是将.java文件保存在并行目录层次结构中(即你有src / org / mycompany / MyClass.java和test-src / org / mycompany / MyClassTest.java)。这样,对于Java来说,两者都在同一个包中,并且可以相互访问,对于发布版本,您只是不编译测试类(或者甚至不检查它们) - 这样一切都很好地分开。
如果这不适用于您的情况,也许您可以更详细地编辑您的问题?
答案 2 :(得分:1)
这将是一个混乱和困难 组织,因为我有很多课程 在这种情况下。
你的意思是java文件看起来很乱吗?您可以在不同的.java文件中拆分内部类。
<强> ClassA.java 强>
package org.application;
public class ClassA {
}
<强> Internal.java 强>
package org.application;
class ClassB {
}
class SomeOtherInternalClass {
}
希望这有帮助。
答案 3 :(得分:1)
我想我理解你的问题,答案是到目前为止在java中没有办法做到这一点!
有一些棘手的方法,但它们会对污垢进行编码。
看这里
http://openide.netbeans.org/tutorial/api-design.html#design.less.friend