我正在创建一个Java库,作为最终产品,打算将此.jar分发给开发人员。
我正在从Objective-C“翻译”我的库,在那里我控制哪些类头文件对开发人员是可用的。换句话说,我只向开发人员公开了他们可以处理的几个类。
在我的Java库中,我正在使用包,并且我的包变得非常大。所以我决定把我的模型和控制器分成不同的包。但现在我想要保密的模型,我需要标记为公共,以便从主包中使用。
我的问题是,这是否与我在Objective-C中做的事情背道而驰?
例如,我有一个事件类,它实际上只在内部使用,我不希望用户知道或考虑它。我还有另一个类TimedEvent,用户可以获取一个manage的实例。
在我的Objective-C中,我简单地将Event类排除在库的公共作用域之外,允许使用TimedEvent。
如果我使我的库中的东西更整洁,那么似乎包不是办法。从现在起,我的主控制器在主包中,所有的模型都在另一个包中-强制拥有公共作用域。
意见?
发布于 2012-07-09 22:07:48
这在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(); }
}
}很难看,不是吗?
发布于 2012-07-09 22:12:15
控制类向外界公开的常见方法是将实现隐藏在接口和工厂后面。
工厂为子包中的接口创建一个接口,并创建一个用于创建工厂接口实例的类
TimedEvent sub-package
中实现TimedEvent接口的类的实例
下面是一个如何做到这一点的示例:
package com.my.main;
public interface TimedEvent {
void fire();
}
package com.my.main.events;
import com.my.main;
public class EventFactory {
public TimedEvent makeTimedEvent() { return new TimedEvent (); }
}
// TimedEventImpl has package visibility - it is not public.
class TimedEventImpl implements TimedEvent {
public void fire() {
// Fire a timed event
}
}用户可以像这样访问TimedEvent:
com.my.main.events.EventFactory f = new com.my.main.events.EventFactory();
com.my.main.TimedEvent evt = f.makeTimedEvent();
evt.fire();https://stackoverflow.com/questions/11396409
复制相似问题