为什么每个公共类都在一个单独的文件中?

San*_*box 45 java code-organization

我最近开始学习Java,发现很奇怪每个Java类必须在一个单独的文件中声明.我是C#程序员,C#没有强制执行任何此类限制.

为什么Java会这样做?有任何设计考虑因素吗?

编辑(基于几个答案):

为什么Java现在还没有在IDE时代消除这种限制?这不会破坏任何现有代码(或者它会吗?).

leo*_*ora 57

我刚刚采用了一个C#解决方案并且做了这个(删除任何包含多个公共类的文件)并将它们分解为单个文件,这使生活变得更加容易.

如果文件中有多个公共类,则会遇到一些问题:

  1. 你怎么命名这个文件?公共课程之一?另一个名字?人们在糟糕的解决方案代码组织和文件命名约定方面存在足够的问题以产生一个额外的问题

  2. 此外,当您浏览文件/项目资源管理器时,事情并未隐藏.例如,您可以看到一个文件并向下钻取,并且共有200个类.如果您有一个类的一个文件,则可以更好地组织测试并了解解决方案的结构和复杂性.

我认为Java是正确的.

  • 究竟.同一个文件中的更多类是一场噩梦.这只会让生活变得复杂,我认为没有任何优势. (11认同)
  • 是的,这对我来说很有意义.这不仅仅是因为我是一名Java程序员,而且因为它使得命名方案本身就属于某种程度. (5认同)
  • 也许,但灵活性并不总是最好的.我们越来越多地看到基于约定优于配置的解决方案的好处. (5认同)
  • 另一方面,我仍然认为决定应留给开发人员,而不是强制执行. (4认同)

Mar*_*off 33

根据Java语言规范,第三版:

这种限制意味着每个编译单元最多只能有一个这样的类型.这种限制使得Java编程语言的编译器或Java虚拟机的实现很容易在包中找到命名类 ; 例如,公共类型wet.sprocket.Toad的源代码可以在wet/sprocket目录中的Toad.java文件中找到,相应的目标代码可以在同一目录中的Toad.class文件中找到.

重点是我的.

看起来基本上他们想要将操作系统的目录分隔符转换为命名空间的点,反之亦然.

所以是的,这是某种设计考虑因素.

  • 或者我会说当他们开发Java时他们很懒:) (3认同)
  • 有没有人有在没有树状结构的直升机的平台上使用Java的经验?也许有人在VM/CMS之类的东西上工作(或者它现在确实有树结构 - 上次我用的是大约1988年)可以发表评论吗? (2认同)

Von*_*onC 17

来自Java的思考

:

每个编译单元(文件)只能有一个公共类.
这个想法是每个编译单元都有一个由该公共类表示的公共接口.它可以拥有任意数量的支持"友好"课程.如果编译单元中有多个公共类,编译器将给出错误消息.


规范(7.2.6)

当包存储在文件系统(?7.2.1)中时,如果在由类型名称加上名称的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制.如果满足以下任一条件,则为扩展名(例如.java或.jav):

  • 该类型由声明类型的包的其他编译单元中的代码引用.
  • 该类型被声明为public(因此可以从其他包中的代码访问).
  • 这种限制意味着每个编译单元最多只能有一个这样的类型.
  • 这种限制使得Java编程语言的编译器或Java虚拟机的实现很容易在包中找到命名类 ; 例如,公共类型wet.sprocket.Toad的源代码可以在wet/sprocket目录中的Toad.java文件中找到,相应的目标代码可以在同一目录中的Toad.class文件中找到.

简而言之:它可能是关于查找类而无需在类路径上加载所有内容.

编辑:"可能选择"似乎它留下了遵循该限制的可能性,并且"可能"的含义很可能是RFC 2119中描述的那个(即"可选")
但在实践中,这是在如此多的平台中强制实施的并且依赖于如此多的工具和IDE,我没有看到任何"主机系统"选择强制执行该限制.


从" 曾经的橡树...... "

这很明显 - 就像大多数事情一旦你知道设计原因 - 编译器必须通过所有编译单元(.java文件)进行额外的传递,以找出哪些类在哪里,这将使编译更慢.

(注意:

Oak版本Oak语言规范0.2(后记文档):Oak是现在通常称为Java的原始名称,本手册是Oak(即Java)最早的手册.
有关Java起源的更多历史,请查看绿色项目Java(TM)技术:早期历史
)


oxb*_*kes 6

这只是为了避免混淆,因为从开发人员的角度来看,Java是以简单的方式创建的.您的"主要"类是您的公共类,如果它们位于具有相同名称的文件中并且位于类的包指定的目录中,则它们很容易找到(由人工).

您必须记住,Java语言是在90年代中期开发的,在IDE进行代码导航和搜索之前的日子里.

  • 不 - 我只是对用户更容易 - 我修改了我的答案 (4认同)
  • IDE从80年代中期开始(至少) - 曾经听说过Turbo Pascal? (4认同)
  • 更容易找到谁?编译器. (2认同)
  • @oxbow_lakes请查看http://stackoverflow.com/questions/1318712/why-is-each-public-class-in-a-separate-file/1318752#1318752.看起来它更容易找到编译器而不是人类 (2认同)