Java:一个文件中的多个类声明

2024-03-14

在 Java 中,您可以在单个文件中定义多个顶级类,前提是其中最多有一个是公共的(请参阅JLS §7.6 http://docs.oracle.com/javase/specs/jls/se8/html/jls-7.html#jls-7.6)。参见下面的例子。

  1. 这种技术有一个简洁的名称吗(类似于inner, nested, anonymous)?

  2. JLS表示系统may强制执行这些次要类不能的限制referred to by code in other compilation units of the package,例如,它们不能被视为包私有的。这真的是 Java 实现之间发生变化的事情吗?

例如,PublicClass.java:

package com.example.multiple;

public class PublicClass {
    PrivateImpl impl = new PrivateImpl();
}

class PrivateImpl {
    int implementationData;
}

Javac并没有主动禁止这一点,但它确实有一个限制,这几乎意味着您永远不想引用另一个文件中的顶级类,除非它与它所在的文件具有相同的名称。

假设你有两个文件,Foo.java and Bar.java.

Foo.java包含:

  • public class Foo

Bar.java包含:

  • public class Bar
  • class Baz

我们还假设所有类都位于同一个包中(并且文件位于同一目录中)。

如果发生什么情况Foo指的是Baz但不是Bar我们尝试编译Foo.java?编译失败并出现如下错误:

Foo.java:2: cannot find symbol
symbol  : class Baz
location: class Foo
  private Baz baz;
          ^
1 error

如果你仔细想想,这是有道理的。如果Foo指的是Baz,但是没有Baz.java (or Baz.class), 怎么能javac知道要查看什么源文件吗?

如果你改为告诉javac编译Foo.java and Bar.java同时,或者如果您之前已经编译过Bar.java(离开Baz.class where javac可以找到它),或者即使Foo恰好指的是Bar此外Baz,然后这个错误就消失了。然而,这会让您的构建过程感觉非常不可靠且不稳定。

因为实际的限制更像是“不要引用另一个文件中的顶级类,除非它与其所在的文件具有相同的名称,或者您还引用了另一个与该文件也在该文件中”有点难以理解,人们通常采用更直接(尽管更严格)的约定,即在每个文件中放置一个顶级类。如果您改变了关于某个类是否应该公开的想法,这也会更好。

较新版本的javac在这种情况下也可以产生警告-Xlint:all:

auxiliary class Baz in ./Bar.java should not be accessed from outside its own source file

有时,每个人以特定方式做某事确实有充分的理由。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:一个文件中的多个类声明 的相关文章

  • 在 Java 1.7.0 下运行的 SQL-Server (MSSQL-JDBC 3.0) 中的日期列检索为过去 2 天

    当使用 SQLServer2008 从 SQLServer2008 检索 DATE 类型的列时 出现奇怪的效果在官方 Oracle JDK 1 7 0 下运行时 主机操作系统是Windows Server 2003 所有日期列均检索为two
  • 为什么源码中的根包叫“com”? [复制]

    这个问题在这里已经有答案了 在大多数源代码中 根包 文件夹被命名为 com 为什么会这样 它只是约定俗成还是代表着什么 The 习俗 http download oracle com javase tutorial java package
  • IBM WebSphere MQ 2042 错误

    我有以下代码 int openOptions MQC MQOO INQUIRE MQC MQOO FAIL IF QUIESCING MQC MQOO INPUT SHARED 执行时 我收到错误 com ibm mq MQExceptio
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • Android 支持 v4 22.2.0 的 Proguard 配置

    更新 Gradle Android 构建的依赖关系后使用com android support support v4 22 2 0从本地 Maven extras 存储库 在 SDK 内 Proguard 开始抛出这些问题 Warning
  • 我们如何使用 StringBuilder 在字符串前面添加字符串?

    我知道我们可以使用附加字符串StringBuilder 有没有一种方法可以使用前置字符串 即在字符串前面添加字符串 StringBuilder这样我们就可以保持性能优势StringBuilder offers 使用位置参数设置为 0 的 i
  • 如何在 spring 中将模型作为重定向属性传递

    redirectModel addAttribute Model model return REDIRECT PREFIX my company organization management manage users 当我通过这个时 我得
  • Jackson @JsonRawValue 获取地图的值

    我有以下 Java bean 类 使用 Jackson 将其转换为 JSON public class Thing public String name JsonRawValue public Map content new HashMap
  • 为什么图很大时x轴消失了

    我正在尝试使用加载大图JFreeChart 但是 当缓冲图像超过一定大小时 X 轴会出现问题 这些值在 X 轴上消失 这可以在图像的第三张图中看到 I would appreciate any help in fixing the prob
  • Hibernate - 一对多关系和孤儿删除级联

    我有一个基本的一对多关系父 子关系 就像 Hibernate 参考书第 21 章中一样 级联仅从子级到父级 保留级联只是因为我不想在删除子级时删除父级 当我向父级添加一个子级并保存该子级时 出现 TransientObjectExcepti
  • 根据使用频率随机生成字母?

    如何根据常用语音中的使用频率随机生成字母 任何伪代码都值得赞赏 但如果用 Java 实现就更棒了 否则 只需朝正确的方向戳一下就会有所帮助 注意 我不需要生成使用频率 我确信我可以很容易地查找到它 我假设您将频率存储为 0 到 1 之间的浮
  • 如何处理过时的连接?

    我们的应用程序是一个 J2EE 应用程序 在 Websphere 6 1 上通过 Mainframe DB2 后端使用 Struts EJB Hibernate 最近已投入生产 我们收到过时的连接异常当用户第一次或有时登录应用程序时 此异常
  • 避免实现接口中存在的方法 - java

    我有一个如下所示的界面 public interface a public void m1 public void m2 public void m3 public class A implements a public void m3 i
  • 在Java程序中打开Windows虚拟键盘

    我想在按钮中创建一个事件 当我单击按钮时 我想打开 Windows 虚拟键盘 你能帮我看一下代码吗 谢谢您的合作 此致 您可以使用 getRuntime 来执行它 import java io IOException public clas
  • java 对字母数字字符串进行排序

    我有这个数组存储用户添加的一些 URL 的后缀 U2 U3 U1 U5 U8 U4 U7 U6 当我这样做时 for Map
  • 在具有重载构造函数的类中传递 null 时,首先调用哪个构造函数?

    下面是具有 3 个重载构造函数的 java 类 public class Test public Test Object i System out println Object invoked public Test String i Sy
  • 在idea ide中出现钻石运算符的编译错误

    我在尝试在idea ide中编译一些简单的源代码时收到此错误 java diamond operator is not supported in source 1 6 use source 7 or higher to enable dia
  • 自定义 lint 规则,确保不调用特定方法

    我想确保在我的 Android 应用程序 Java 和 Kotlin 代码中 中不会调用特定类的特定方法 假设 我有一个名为Bar有两种方法 allowed and disallowed 这是代码 package com public cl
  • 使用 libGDX 写入 Json

    我是 Json 和 libGDX 的新手 但我创建了一个简单的游戏 我想将玩家姓名及其分数存储在 Json 文件中 有没有办法做到这一点 我想创建一个 Json 文件Gdx files localStorage如果它不存在 如果存在 则向其
  • 无法解析类或包“h2”

    我为我的网络应用程序开发后端应用程序 在我的项目 SpringBoot Maven 中 我想添加 h2 数据库 根据网上的教程 添加了以下几行应用程序属性 file server port 8088 spring h2 console en

随机推荐