java - 我应该如何在Java中实现接口(interface)? [代码正确性]

标签 java oop interface correctness

首先,这不是一个关于如何在 Java 中实现接口(interface)的问题,也不是关于接口(interface)错误的问题。这是一个关于根据具体情况采取正确方法的问题。

首先,如果这不是发布此问题的正确“堆栈”,我谨表示歉意,请告诉我,我会将其移至另一个堆栈。

让我们开始吧。

我试图猜测哪种是在 Java 中实现接口(interface)的最佳方式。假设我们有一个 A 类,如下所示:

public Class A {

    public A(){}
    public void fooA() {}
}

还有一个界面

public interface MyListener {
    public void fooListener();
}

fooA() 中,我以这种方式使用接口(interface) B:

...
something.setFooListener(/**Doubts here**/)
....

我们应该在 setFooListener(...) 中输入什么

选项是(据我所知):

A) 定义 setFooListener 函数内的行为:

new MyListener.fooListener() {
    /** Implementation of fooListener() **/
}

优点:

  • 在阅读函数时简单易读。

  • 您可以直接访问 fooA() 中定义的 FINAL 变量。

缺点:

  • 如果您的实现足够长,最终会导致缺乏可读性和函数过长。
  • 如果您在同一个类的几个地方实现该接口(interface),您将重复大量代码。

B) 创建一个实现接口(interface)的内部类:

private class MyListenerImplementation implements MyListener {
    private String var1;
    private int var2;

    public MyListenerImplementation() {/** constructor **/}

    public void fooListener() {
        /** Do logic here **/
    }
}

优点:

  • 您可以保留对 MyListenerImplementation 对象的引用。
  • 您可以定义变量、函数和所有内容,因为它与任何其他对象一样都是对象。
  • 更简洁的代码。

缺点:

  • 也许需要更多内存。
  • 可能会创建不必要的类

C) 保存一个带有接口(interface)实现引用的变量

private MyListener.FooListener myListenerVar = new MyListener.FooListener() {
    /** Logic goes here **/
};

优点:

  • 我实际上看不出有人可以与 B 进行比较,但有很多缺点。

缺点:

  • 不是干净的代码。在你的类(class)中这样做至少是一种 war 罪。
  • 我认为将代码块分配给变量是不正确的。
  • 我不喜欢这个样子;)

D)我能想到的最后一个;定义一个函数并在内部返回实现

private MyListener.fooListener createMyListener() {
    return new MyListener.fooListener() {
        /** Logic goes here **/
    }
}

优点:

  • 它比 C 更干净。
  • 可重用性

缺点:

  • 与 C 几乎相同。
  • 我认为返回整个代码块是不正确的。

总结一下:我最喜欢的是“B”,但我想知道SO对此有何看法。

感谢您的建议。

最佳答案

选项 A 在语法上不正确。你的优点和缺点都是有效的。

选项B:

  • 也许需要更多内存:不需要。
  • 也许会创建不必要的类:不。选项 A 还创建一个类。它是匿名的,但它是一个类,必须像任何其他类一样由 ClassLoader 加载。

选项 C:它与 A(匿名类用法)完全相同,只不过您使用监听器初始化字段。该规则与任何其他变量相同:尽可能缩小其范围。如果您需要字段范围,请使用此选项。如果您只需要在一种方法中使用监听器,则使用局部变量(选项 A)。

选项 D:再次与 A 相同,只不过您返回创建的监听器而不是仅使用它。

我的回顾:您在这里混合了三个正交问题。

  1. 我应该使用匿名内部类、命名嵌套类还是顶级类。这取决于类中包含的代码量,以及需要在何处使用此类:在单个顶级类中,还是在许多顶级类中。
  2. 我应该使用局部变量还是实例变量?这是范围和状态的问题,而不是接口(interface)实现的问题。您的字段或局部变量可以使用任何类型的接口(interface)实现的实例进行初始化
  3. 您应该使用返回实例的工厂方法,还是应该直接使用new。再说一次,这与你的界面的实现方式无关。如果您想要松散耦合,因为工厂方法可能返回同一接口(interface)的不同实现,请使用工厂。否则,新的就可以了。

关于java - 我应该如何在Java中实现接口(interface)? [代码正确性],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487209/

相关文章:

java - 需要帮助将 EBCDIC 转换为十六进制

java - Maven 全新安装 : Failed to execute goal org. apache.maven.plugins :maven-resources-plugin:3. 2.0:resources

具有相同目标的服务和 DAO 层类的 javadoc

c++ - C++ 中的模板类……必需的技能集?

Python 2.7 简介。到类 : "' module' object is not callable"

java - 在 FragmentActivity 中初始化接口(interface)

java - Micronaut 中是否有 DropwizardTestSupport 的等效项?

javascript - 捕捉/监听函数的执行

generics - F#:尝试通过界面复制和更新记录时出错

c# - 匿名类实现接口(interface)