Java 类范围和库

标签 java class package

我正在创建一个 Java 库,作为最终产品,打算将此 .jar 分发给开发人员。

我正在“翻译”我的 Objective-C 库,在 Objective-C 中我控制哪些类头文件可供开发人员使用。换句话说,我只向开发人员公开了他们可以处理的几个类。

在我的 Java 库中,我正在使用包,而且我的包已经变得很大。所以我决定将我的模型和 Controller 分成不同的包。但是现在我想保持私有(private)的模型需要标记为公开以便从主包中使用。

我的问题是这是否违背了我在 Objective-C 中所做的事情?

例如,我有一个仅在内部使用的事件类,我不希望用户知道或考虑它。我有另一个类 TimedEvent,用户可以获得一个管理实例。

在我的 Objective-C 中,我只是将 Event 类从库公共(public)范围中排除,允许使用 TimedEvent。

如果我想让我的库中的东西更整洁,那么包似乎不是办法。从现在开始,我的主 Controller 在主包中,所有模型都在另一个包中 - 强制具有公共(public)范围。

意见?

最佳答案

这在 Java 中是可能的,但是(几乎)没有人这么做是有原因的......

如果将实现和接口(interface)放在同一个包中,则可以省略所有访问修饰符(privateprotectedpublic ) 从类和方法中赋予它们“默认”或“包”可见性:只允许同一包中的类查看/使用它们。

缺点:您必须混合使用 API 和实现。

另一种方法是将实现移动到包 *.private.* 中。不再混合 API 和实现,但恶意用户可以轻松访问实现 - 这只是一个命名约定。就像一个停止标志:它意味着什么(“小心”)但实际上并没有阻止你。

最后,您可以在接口(interface)内部实现接口(interface)。例如:

public interface IFoo {
    String getName();

    private static class Foo implements IFoo {
        public String getName();
    }

    public static class FooFactory {
        public static IFoo create() { return new Foo(); }
    }
}

很丑,不是吗?

关于Java 类范围和库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396409/

相关文章:

java - Java 泛型和 Scala 的交集……进展不顺利

python - 使类可转换为 ndarray

Python 类初始化函数

java - 按钮的文本循环遍历字符串数组

java - 无法在 Netbeans IDE 打包的浏览器中运行简单的 JavaFX

r - 从 R 包构建中排除数据集

r - 在R包中添加数据集

python - 如何在Python中以编程方式调用函数并以编程方式指定模块?

java - 在 Android 上创建游戏内 Web 浏览器

c++ - 在构造函数之后立即编程 SegFaults。 C++