我应该将公共接口放在单独的文件中吗?

Posted

技术标签:

【中文标题】我应该将公共接口放在单独的文件中吗?【英文标题】:Should I put a public interface in a separate file? 【发布时间】:2011-01-24 07:15:21 【问题描述】:

我有以下代码:

import com.apple.dnssd.*;

public interface IServiceAnnouncer 
    public void registerService();
    public void unregisterService();
    public boolean isRegistered();


class HelloWorld 
        public static void main(String[] args) 
                System.out.println("Hello, World!");
        

此代码保存在名为“HelloWorld.java”的文件中。 Java 编译器抱怨此代码。它写道IServiceAnnouncer 类是公共的,它应该在一个名为“IServiceAnnouncer.java”的文件中声明。

我对此有几个问题:

    为什么编译器会说IServiceAnnouncer 是一个类?是一个界面。还是接口是类的部分案例?

    如果我将接口IServiceAnnouncer 放在一个名为“IServiceAnnouncer.java”的单独文件中(如编译器所希望的那样),那么如何从“HelloWorld.java”中使用它?

    public interface 是什么意思?公共接口和非公共接口有什么区别?

【问题讨论】:

与您的问题无关,但根据标准 Java 编码标准,您应该将“I”放在接口前面。 @Steve Kuo:很好的建议,但你可能有话要说。 :-) java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html 【参考方案1】:

你应该把它放在一个单独的文件中。这样一来,在不了解您的实现细节或不得不拖入相关依赖项的情况下,可以更轻松地交换不同的实现,或者使接口(您系统的 API)可供其他人编写代码。

例如常见 Java API 的实现 - 例如servlets - 将有一个针对 Sun 提供的接口包编码的实现(在本例中为 javax.servlet

如何在您的实施中使用它?通过导入它。如果它在同一个包中并且您正在一次编译所有接口/实现,则这是不必要的。

请注意,接口以与实现相同的方式编译为 .class 文件(您使用 class 定义的内容)。

【讨论】:

接口不必是公开的。它们可以在包中有用,甚至可以在类中私下使用(我已经为 State 模式这样做了)。 你能提供一个例子以及如何编译它。这真的很有帮助。我遇到了同样的问题。 ***.com/questions/64442243/…【参考方案2】:

这些答案在正确的答案周围跳舞。

    是的,您可以在一个 Java 文件中声明多个类。 您不能声明多个公共类,因为: 公共类的名称必须与其包含的文件名匹配;这是你的编译错误

在 Java 中在一个文件中声明多个类是很奇怪的,尽管你可以这样做。不要这样做。

您将 IServiceAnnouncer 放在一个单独的文件中,并在 HelloWorld.java 中导入类名。您只需同时编译它们,将两个文件名传递给 javac。一切正常。

与 Java 中的任何其他公共接口一样,公共接口是一种对任何其他类都可见和可用的类型。没有“public”,它的可见性称为包私有,这意味着只有同一个包中的东西才能使用它。

【讨论】:

【参考方案3】:

你别无选择。所有公共类/接口都必须位于名为 ClassOrInterfaceName.java 的文件中。

【讨论】:

【参考方案4】:

编译器使用术语“类”有点松散。更通用的术语可能是“类型”。我猜编译器使用术语“类”,因为它从每个类型声明(classinterfaceenum)中生成相同格式的“.class”文件。

接口不一定是public。如果声明时没有访问修饰符,则只能在其“包”内访问。

Java 类型可以(应该)在包中声明。包是应该一起构建和部署的 Java 类型的集合。默认情况下,一个包中的所有类型都是隐式导入的,所以如果你的接口在同一个包中,那么HelloWorld类可以使用它。

当你不声明一个包时,一个类型在默认包中。因此,即使您只是将IServiceAnnouncer 接口放在单独的文件中,HelloWorld 也可以使用它。只需同时编译这两个文件。

【讨论】:

【参考方案5】:

    一个文件中有多个类定义的问题是以下错误,在使用版本控制并且多个开发人员在同一个项目上工作时可能会出现以下错误:

    duplicate class: X
    class X 
    

    因此,最好将公共(以及非公共,顺便说一句)类放在单独的文件中。这将减少出现这些错误的机会。

    如果在同一个文件夹,就用IServiceAnnouncer,如果在不同的文件夹,就用import吧。

    public 在所有包中都可见。不public 表示protected 的一种(而关键字protected 是被禁止的,奇怪吧!):它只能在同一个包中可见。如果您不确定包是什么,请查看 Java 教程。 http://java.sun.com/docs/books/tutorial/java/package/packages.html

【讨论】:

【参考方案6】:

1) 编译器只是抱怨您定义了 2 个公共***类型。你不能在 Java 中做到这一点。如果您愿意,您可以将接口嵌套在您的类中,或者将其设为非公开(默认可见性),但这在 Java 中不太常见,在这里可能不太有用。

2) 您要么需要实现接口,要么可以访问实现它的对象。

3) 接口可以是公共的,也可以是默认(包)可见性。接口中的方法不需要 public 修饰符,因为它们默认是公共的。

【讨论】:

3) 不正确:并非所有***(非嵌套)接口都是公共的。它们仅在定义为公开时才公开。试试看! 是的,我应该提到包的可见性! 你可以在Java中定义任意多个***类,只是公共的必须与文件名匹配,这意味着你只能在一个***公共类型中声明一个文件。

以上是关于我应该将公共接口放在单独的文件中吗?的主要内容,如果未能解决你的问题,请参考以下文章

异常应该放在单独的包中吗?

将 DLL 加载到具有已知唯一公共接口的单独 AppDomain 中

当你在 MySQL 或 PostgreSQL 中有一个 TEXT 字段时,你应该把它放在一个单独的表中吗?

我们可以将基类的私有成员继承到派生类的公共成员中吗?

Angular 6,我应该将秘密环境变量放在 environment.ts 文件中吗?

为啥我们应该将接口方法声明为公共的? [复制]