Java 中的 JAR 级(汇编级)类范围

发布于 2024-12-06 18:56:48 字数 471 浏览 0 评论 0原文

在 C# 中,如果我希望某个类对该程序集 (DLL) 中的任何类都可见,我只需将其范围设置为 internal(这是默认设置)。

如何在 Java 中执行此操作?在 Java 中,我注意到默认/内部作用域是包级别,而不是JAR 级别。对我来说是一个问题,因为我有一个库,它有几个具有不同职责(视图、控制器等)的子包,并且不能将它们放在同一个包中。

例如,我有两个类,例如 com.stackoverflow.main.first.One 和 com.stackoverflow.main.second.Two,它们都应该能够互相实例化。

编辑:我不希望该类是公共并且对引用它的任何人都可见。它只是一个内部类。。我正在创建一个用于消费的 API,对我来说最重要的是我的 JAR 的消费者可以看到哪些类。

In C#, if I want a class to be visible to any class within that assembly (DLL), I simply scope it as internal (which is the default).

How can I do this in Java? In Java, I've noticed the default/internal scoping is package level, not JAR level. This is a problem for me, since I have a library that has several sub-packages with different responsibilities (view, controller, etc.) and can't put them in the same package.

As an example, I have two classes like com.stackoverflow.main.first.One and com.stackoverflow.main.second.Two, both of which should be able to instantiate each other.

Edit: I don't want the class to be public and visible from anyone who references it. It's an internal class only. I'm creating an API for consumption, and of primary importance to me is which classes can be seen by consumers of my JAR.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅浅淡淡 2024-12-13 18:56:48

Java 没有库级作用域的概念。将类公开或使用工厂。

Java has no concept of library-level scoping. Make the classes public or use a factory.

你不是我要的菜∠ 2024-12-13 18:56:48

为了实现您想要的目标,您必须使用工厂模式的某种组合来创建您想要公开的类,并将私有类包保留为私有。通常,我会这样做:

  1. com.foo.bar 等包中创建 API 的公共接口,并在 public interface Foo {}
  2. 创建一个工厂类公开一个创建方法:
    公共类 FooFactory{
    公共 Foo buildFoo(){ 返回 new FooImpl(); }
  3. 创建 FooImpl 作为包私有类 - class FooImpl 实现 Foo{}
  4. 文档包以指示正确的用法。

它并不完美,但在有关模块作用域的 JSR 取得进展之前,它可能是您在 java 中可以获得的最接近的结果。如果您想确保 FooImpl 不会被不当扩展,请确保将其标记为 Final。

To accomplish what you want, you'll have to use some mix of a factory pattern to create the classes you want to expose and leave the private classes package private. Usually, I've done this:

  1. create the public interface for the API in a package like com.foo.bar a la public interface Foo {}
  2. create a factory class that exposes a create method a la:
    public class FooFactory{
    public Foo buildFoo(){ return new FooImpl(); }
  3. create FooImpl as a package private class - class FooImpl implements Foo{}
  4. Document package to indicate proper usage.

It's not perfect, but until the JSR about module scoping progresses, it's probably the closest you can get in java. If you want to ensure that FooImpl doesn't get inappropriately extended, be sure it is marked final.

蓝咒 2024-12-13 18:56:48

听起来很简单,因为您必须使用公共访问修饰符。

sounds as simple as you have to use the public access modifier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文