我正在实现一个系统,我有一个名为'MyMethod'的接口(名称是任意的),很多小类正在实现这个方法(特别是覆盖它的'call'方法),我正在使用用于将这些实例创建到列表中的多态性。
问题是,由于我有许多实现该方法的小类,因此将这些类放在同一个java文件(MyMethod.java)中更容易,如下所示:
public interface MyMethod {
public String call(foo param1, bar param2) throws SQLException, IOException;
}
class FooMethod1 implements MyMethod {
@Override
public String call(foo param1, bar param2) throws SQLException, IOException {
//Do Something
}
}
class FooMethod2 implements MyMethod {
@Override
public String call(foo param1, bar param2) throws SQLException, IOException {
//Do Something Different
}
}
但是,将这些类放在同一个文件中,虽然更整洁,但我似乎反对在Java中应该完成的事情。
将这些类放在同一个文件中是否可以?或者我应该将它们分别移到一个单独的文件中?
由于
答案 0 :(得分:6)
是的,可以将几个包私有类放在同一个文件中。
JLS的相关部分是§7.3
CompilationUnit:
PackageDeclaration[opt] ImportDeclarations[opt] TypeDeclarations[opt]
TypeDeclarations:
TypeDeclaration
TypeDeclarations TypeDeclaration
如您所见,编译单元可能有多个类型声明(或零)。 JLS的另一个相关部分是§7.6。它解释了从编译单元外部访问的那些类型声明与编译单元的文件名之间的相互关系:
当且仅当包存储在文件系统(§7.2)中时,主机 系统可以选择强制执行编译时的限制 如果在由...组成的名称下的文件中找不到类型,则会出错 类型名称加上一个扩展名(如.java或.jav) 以下是真的:
该类型由其他编译单元中的代码引用 声明类型的包。
该类型已声明为public(因此可以访问 来自其他软件包中的代码。)
此限制意味着每个类型最多只能包含一个此类型 编译单位。这种限制使Java编译器变得容易 在包中查找命名类。在实践中,许多程序员 选择将每个类或接口类型放在自己的编译中 单位,无论是公开的还是由其他代码引用的 编译单位。
显然,您的方法不是针对Java,而是完全正常。但是,请注意您的MyMethod
实现可能在MyMethod.java
编译单元之外不可用,具体取决于编译器实现。虽然, javac 和 Eclipse编译器似乎都没有问题...