Java的类范围和库(Java Class scope and library)

2019-07-30 08:02发布

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

我“翻译”从Objective-C的我的图书馆,我控制哪些类的头文件提供给开发者。 换句话说,我只暴露于开发商几类,他们可以处理。

在我的Java库我使用的包和我的包已经成长相当大。 所以我决定分成不同的包我的模型和控制器。 但现在我想保持私人模特,我需要为从主包中使用标记为公开。

我的问题是这样做违背了我的Objective-C中做什么?

例如,我有这实在是仅供内部使用,我不希望用户知道它还是想想一个事件类。 我有另一个类TimedEvent,用户可以得到的管理实例。

在我的Objective-C,我只是排除事件类从图书馆公共范围,允许TimedEvent。

如果我做的事情在我的图书馆更整洁的话,好像包是没有办法的办法。 因为现在,我的主控制器是在主包,所有的车型都在另一个包 - 被迫有一个公共的范围。

意见?

Answer 1:

这是可能的与Java,但是是有原因的(几乎)没有人做它...

如果你把实现和接口在同一个包,那么你可以省略所有访问修饰符( privateprotectedpublic的类和方法),以给他们“默认”或“包”可视性:只有类在同一个包是允许查看/使用它们。

缺点:你必须混合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(); }
    }
}

丑,是不是?



Answer 2:

要控制你的类接触到世界上最常见的方法是躲在后面的接口和工厂实现。

  • 为您的接口TimedEvent ,和一类用于创建实例TimedEvent接口
  • 放在主包中的接口,以及工厂子包
  • 给工厂知名度公
  • 实现在子包的界面,给它包可见
  • 创建类的实现的实例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();


文章来源: Java Class scope and library