【问题标题】:Multiple inherited classes, do they have to be in separate files?多个继承的类,它们必须在单独的文件中吗?
【发布时间】:2012-11-14 23:24:39
【问题描述】:

我正在实现一个系统,其中我有一个名为“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 中应该做的事情。

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

谢谢

【问题讨论】:

  • 我不明白为什么这值得反对。我认为这对于新手来说实际上是一个很好的问题......好吧,也许他自己可以在公约文档中找到它,但实际上:最佳实践和公约多久相同?

标签: java oop inheritance methods


【解决方案1】:

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

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 编译器 似乎都没有这方面的问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2014-06-21
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多