public class
的名称相同。这个限制是为什么?它有什么用途?public class
的名称相同。这个限制是为什么?它有什么用途?Java采用了一种有趣的方法:当给程序员多个选项只会削弱编程体验时,就移除这些选项。
他们在许多地方都这样做了。文件名和包名肯定是如此,但也不允许在一个文件中拥有多个公共类(从来不好),也不允许将类分割成多个文件(非常难以处理!)等。
语言在很多决策上都会影响可用性和可维护性。还有一些可能是不错的选择:
公共变量:我从来没有需要过它,并且我从来没有见过一种情况,其中一些聪明的程序员认为需要其中之一并且实际上是正确的。
方法/类大小限制确实不错,但这可能有些棘手(可以通过代码检查器轻松实施,问题通常在于最需要帮助的公司却不知道自己需要帮助,因此不使用代码检查器等工具)。
回答的重点是,尽管这些对于大多数小团队并不重要,但当您的团队扩大并且拥有多个分布在世界各地的分立团队和顾问时,您真的会感到这种不灵活性的重要性。
对于设置器和获取器的评论回复:
Java bean是Borland创建的一个丑恶物来混合他们的GUI,然后被改装成Java。
这是个可怕的想法--它分散了OO编程的注意力--Getter和setter A)显示了太多的实现细节,并且B)让您以操作其他对象的数据而不是请求其他对象为您执行操作的方式思考。这是为那些还不能以OO思考的人准备的坏hack。
偶尔需要使用Getter,但除非绝对避免不了,否则不应添加。
应尽可能避免使用Setter。如果您绝对需要在对象构造后外部修改状态,请尝试使用构建器模式并保护您的Setter在任何操作被执行后不被调用。
显然,所有事情都有例外,许多“getter”实际上是关键的对象业务逻辑,例如String.length(),无论如何实现String都需要该方法,并且甚至不能通过返回属性来实现 - 如果你愿意称其为“getter”的话,这是一个很好的例子。
我本来想说这是绝对必须的。但是我看了一下JLS,发现它并不那么严格。从JLS的角度来看,设置此类限制是由编译器自行决定的。
实际上,通常使用的编译器确实有这种限制,正如其他人已经解释的那样,对于编译器查找编译单元或者类加载器查找类文件来说,设置这种限制会更容易些。
更具体地说,文件名应该与该文件中的公共类名称相同,这是告诉JVM这是您的入口点的方法。
Bar.java
的文件中创建一个非“public”类,称为Foo
,编译它,并通过java Foo
运行它。 java
工具不关心类是否为“public”,并通过您给定的类名确定入口点,而不是源文件的名称(如果关闭调试信息,则源文件甚至不在类字节码中)。其他启动项(运行jar、servlet等)同样以其他方式确定入口点,而不是源文件名。 - T.J. Crowder这对于定位类非常有用。例如,假设允许不同的文件名,如果您已经创建了一个类的实例,则编译器必须在所有文件中搜索该类,而如果文件名与类名相同,则查找和使用类的性能会提高。可能还有其他原因。