3

我正在实现一个系统,其中我有一个名为“MyMethod”的接口(名称是任意的),并且许多小类正在实现此方法(特别是为了覆盖它的“调用”方法),并且我正在使用多态性来创建这些实例到一个列表中。

问题是,因为我有很多实现该方法的小类,所以将这些类放在同一个 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 中应该做的事情。

可以将这些类放在同一个文件中吗?还是应该将它们分别移动到单独的文件中?

谢谢

4

1 回答 1

6

是的,可以将多个包私有类放在同一个文件中。

JLS 的相关部分是§7.3

CompilationUnit:
    PackageDeclaration[opt] ImportDeclarations[opt] TypeDeclarations[opt]

TypeDeclarations:
    TypeDeclaration
    TypeDeclarations TypeDeclaration

如您所见,一个编译单元可能有多个类型声明(或零个)。JLS 的另一个相关部分是§7.6。它解释了从编译单元外部访问的那些类型声明与编译单元的文件名之间的相关性:

当且仅当包存储在文件系统中(第 7.2 节)时,如果在由类型名称组成的名称下的文件中未找到类型,主机系统可能会选择强制限制它是编译时错误如果满足以下任一条件,则加上扩展名(例如 .java 或 .jav):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为公共的(因此可以从其他包中的代码中访问)。

这个限制意味着每个编译单元最多只能有一个这样的类型。此限制使 Java 编译器可以轻松地在包中找到命名类。在实践中,许多程序员选择将每个类或接口类型放在自己的编译单元中,无论它是公共的还是被其他编译单元中的代码引用。

显然,您的方法并不反对 Java,而且完全可以。但是,请注意,您的MyMethod实现可能在编译单元之外不可用MyMethod.java,具体取决于编译器实现。虽然,javacEclipse 编译器似乎都没有这个问题......

于 2012-11-27T10:51:59.363 回答