首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java类作用域和库

Java类作用域和库
EN

Stack Overflow用户
提问于 2012-07-09 21:51:30
回答 2查看 3.2K关注 0票数 9

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

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

在我的Java库中,我正在使用包,并且我的包变得非常大。所以我决定把我的模型和控制器分成不同的包。但现在我想要保密的模型,我需要标记为公共,以便从主包中使用。

我的问题是,这是否与我在Objective-C中做的事情背道而驰?

例如,我有一个事件类,它实际上只在内部使用,我不希望用户知道或考虑它。我还有另一个类TimedEvent,用户可以获取一个manage的实例。

在我的Objective-C中,我简单地将Event类排除在库的公共作用域之外,允许使用TimedEvent。

如果我使我的库中的东西更整洁,那么似乎包不是办法。从现在起,我的主控制器在主包中,所有的模型都在另一个包中-强制拥有公共作用域。

意见?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-09 22:07:48

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

如果您将实现和接口放在同一个包中,那么您可以省略类和方法中的所有访问修饰符(privateprotectedpublic),从而为它们提供“默认”或“包”可见性:只有同一个包中的类才能看到/使用它们。

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

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

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

代码语言:javascript
复制
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(); }
    }
}

很难看,不是吗?

票数 5
EN

Stack Overflow用户

发布于 2012-07-09 22:12:15

控制类向外界公开的常见方法是将实现隐藏在接口和工厂后面。

工厂为子包中的接口创建一个接口,并创建一个用于创建工厂接口实例的类

  • 将该接口放在主包中,工厂在工厂公共包中创建子包中的接口,从而为其提供TimedEvent sub-package

  • Give在工厂

中实现TimedEvent接口的类的实例

下面是一个如何做到这一点的示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
com.my.main.events.EventFactory f = new com.my.main.events.EventFactory();
com.my.main.TimedEvent evt = f.makeTimedEvent();
evt.fire();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11396409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档