我该如何在Java中实现接口? [代码的正确性]

时间:2014-08-25 13:38:53

标签: java oop interface correctness

首先,这不是关于如何在Java中实现接口或关于接口错误的问题。这是一个关于正确方法的问题,具体取决于具体情况。

首先,我想道歉,如果这不是正确的#34;堆栈"发布此问题,请告诉我,我会将其移至另一个。

让我们开始。

我想要猜测的是在Java中实现接口的最佳方式。我们假设我们有一个类A:

public Class A {

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

和界面

public interface MyListener {
    public void fooListener();
}

fooA()内部,我以这种方式使用界面B:

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

我们应该在setFooListener(...)

中输入什么

选项是(据我所知):

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

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

优点:

  • 在您阅读该功能时,简单易读。

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

缺点:

  • 如果您的实施时间足够长,最终会导致缺乏可读性和功能太长。
  • 如果您要在同一个班级的几个地方实施界面,那么您将重复大量代码。

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

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

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

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

优点:

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

缺点:

  • 也许需要更多的记忆。
  • 可能会创建不必要的课程

C)保持变量并引用接口实现

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

优点:

  • 我实际上看不到任何人与B比较,但有很多缺点。

缺点:

  • 不是一个干净的代码。在你的课堂上做这件事至少会是战争罪。
  • 我认为将一段代码分配给变量是不对的。
  • 我不喜欢这看起来如何;)
D)我能想到的最后一个;定义一个函数并在里面返回实现

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

优点:

  • 它比C更清洁。
  • 复用性

缺点:

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

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

感谢您的建议。

1 个答案:

答案 0 :(得分:3)

选项A在语法上不正确。您的利弊是有效的。

选项B:

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

选项C:除了用监听器初始化字段外,它与A(匿名类使用)完全相同。该规则与任何其他变量相同:尽可能减少其范围。如果需要字段范围,请使用此选项。如果您只需要一个方法中的侦听器,那么请使用局部变量(选项A)。

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

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

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