【问题标题】:How to use Java access modifier properly in library development如何在库开发中正确使用 Java 访问修饰符
【发布时间】:2011-04-13 02:58:55
【问题描述】:

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

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

问题是我下面有课

  • ClassA 包装内org.mylibrary
  • ClassB 包装内org.mylibrary.internal

ClassA 需要解析 ClassB,所以 ClassB 需要是公共类。

但是,从图书馆用户的角度来看,我不希望 ClassB 在我的图书馆之外可见。因为它不应该也不需要由用户发起。

我想将 ClassB 移动到包 org.mylibrary 并使其成为包私有类。

如果我将它移到同一个包中,那将是一团糟且难以组织,因为在这种情况下我有很多类,所以在一个大包中会有很多 .java 文件。

通常我将类放在按类别或层分组的包中,我认为这很容易组织。

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

【问题讨论】:

  • 嗨,好问题。我冒昧地编辑了你的格式和语法:-)。

标签: java dependencies access-modifiers


【解决方案1】:

很难给出具体的建议,因为你提供的关于ClassAClassB 的角色和关系的信息太少了。但是,一种通用解决方案(几乎总是用作消除依赖关系的一部分)是ClassB 隐藏在接口后面。那么ClassA 只使用那个接口,所以它不再直接依赖于ClassBClassB 可以设为私有包,其实例由例如将factorydependency injected 转换为ClassA

【讨论】:

  • 感谢您的建议。那么与其将 ClassB 公开,不如将 ClassB 的工厂公开?
  • @teerapap,是的,或者准确地说,InterfaceB 的工厂。
【解决方案2】:

假设 ClassB 是一个带有单元测试的测试包:

为什么 ClassB 需要使用它。通常测试类使用常规类,反之亦然。

一般来说,对于测试类的建议是把它们和常规类放在相同包中,但是在一个并行的目录层次结构中维护.java文件(即你有src/org/ mycompany/MyClass.java 和 test-src/org/mycompany/MyClassTest.java )。这样,对于 Java 来说,两者都在同一个包中并且可以相互访问,而对于发布版本,您只需不编译测试类(或者甚至不检查它们)——这样一切都很好地分开了。

如果这不适用于您的情况,也许您可​​以更详细地编辑您的问题?

【讨论】:

  • 抱歉误导。这不是单元测试。包名称是示例。我已经改了。
【解决方案3】:

这将是一团糟,很难 组织因为我有很多课 在这种情况下。

你的意思是java文件看起来很乱吗?您可以将内部类拆分到不同的 .java 文件中。

ClassA.java

package org.application;

public class ClassA {
}

Internal.java

package org.application;

class ClassB {
}

class SomeOtherInternalClass {
}

希望这会有所帮助。

【讨论】:

  • 不,我不是说文件看起来很乱。我的意思是这个包看起来很乱,因为同一个包中有很多 java 文件。
【解决方案4】:

我想我理解你的问题,答案是到目前为止在 java 中没有办法做到这一点!

有一些棘手的方法,但它们涉及脏编码。

看这里

http://openide.netbeans.org/tutorial/api-design.html#design.less.friend

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 2013-05-25
    • 2010-12-29
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2013-12-14
    相关资源
    最近更新 更多