Java类范围和库

Mr *_*ean 9 java class package

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

我正在从Objective-C"翻译"我的库,在那里我控制哪些类头文件可供开发人员使用.换句话说,我只向开发人员展示他们可以处理的几个类.

在我的Java库中,我正在使用包,而且我的包已经变得非常大.所以我决定将我的模型和控制器分成不同的包.但是现在我希望保密的模型我需要标记为公共,以便从主包中使用.

我的问题是,这与我在Objective-C中做的事情有什么不同吗?

例如,我有一个Event类,它实际上只在内部使用,我不希望用户知道它或考虑它.我有另一个类TimedEvent,用户可以获得一个管理实例.

在我的Objective-C中,我只是从库公共范围中排除了Event类,允许使用TimedEvent.

如果我在我的库中使事情变得更整洁,那么包装似乎不是那样的.从现在开始,我的主控制器位于主包中,所有模型都在另一个包中 - 被迫拥有一个公共范围.

意见?

Aar*_*lla 5

这是可能的Java,但有理由(几乎)没有人这样做...

如果你把实现和接口在同一个包,那么你可以省略所有访问修饰符(private,protected,public从类和方法),以给他们"默认"或"包"可视性:只有在同一个包中的类被允许看/使用它们.

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

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

最后,您可以在界面内部实现接口.例如:

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(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

丑,不是吗?

  • 对界面内部的实现有很好的了解.这是一个新功能吗? (2认同)