如何在库开发中正确使用Java访问修饰符

时间:2010-09-16 09:23:52

标签: java dependencies access-modifiers

我正在开发一个库,其他程序员将导入并将其用于其目的。

我对Java访问修饰符的目标感到困惑。

问题是我有以下课程

    包裹ClassA 中的
  • org.mylibrary 包裹ClassB
  • 中的
  • org.mylibrary.internal

ClassA需要解析ClassB,因此ClassB需要是公共类。

但是,从库用户视图来看,我并不打算在我的库外看到ClassB。因为它不应该也不需要由用户启动。

我想将ClassB移动到包org.mylibrary并使其成为package-private类。

如果我将它移动到同一个包中,那将是一个混乱而且难以组织,因为我在这个场景中有很多类,所以在一个大包中会有很多.java文件。

通常我将这些类放在按类别或图层分组的包中,我觉得它很容易组织。

我该怎么做?人们如何处理这个问题?

4 个答案:

答案 0 :(得分:2)

由于您提供的关于ClassAClassB之间的角色和关系的信息很少,因此很难提供具体的建议。但是,一个通用解决方案(几乎总是用作消除依赖关系的一部分)是隐藏ClassB接口。然后ClassA仅使用该接口,因此它不再直接依赖于ClassBClassB可以使包为私有,其实例由例如factorydependency 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