为什么有人想在Java中使用接口?

时间:2012-06-14 10:04:35

标签: java

我正在阅读接口包含的内容,我理解除了通常它们还可以包含内部类或其他接口。

任何人都可以解释为什么或者出于什么目的想要在接口中放置接口。也是为什么有人会把内部课程放在里面。我在网上看了一下但没有找到任何好的解释,除了指向标准java类之一的链接。我真正需要帮助我理解的是一个简单的例子。

6 个答案:

答案 0 :(得分:5)

以下是我使用内部类的接口的摘录:

public interface EmailService {

    void send(EmailDetails details);

    class EmailDetails {
        private String from;
        private List<String> to = Lists.newArrayList();
        private String messageTemplate;
        //...
    }
}

你知道 - 重点是界面需要一些额外的定义(在这种情况下 - 它的方法接受的参数)。内部接口也是如此。

它可能是一个单独的类/接口,但因为它只与这个接口有关,所以我把它放在那里。

答案 1 :(得分:2)

您不会使用仅与某个特定类或接口相关的内容污染命名空间。

然而,内部类(如果不是静态的)比内部接口更相关,因为它们包含指向包含类的实例的隐藏链接;因此,内部类的实例总是隐式绑定到外部类的实例:

class OuterClass {

   int someField;

   class InnerClass {

      void doSomething () {
         someField += 1; // you can access someField from here
      }

   };

   void methodUsingInnerClass () {
      InnerClass obj = new InnerClass (); // obj knows to which instance of OuterClass it belongs
      someField = 0;
      obj.doSomething ();
      // now someField == 1
   }
};

这通常与匿名类(根据定义是内部类)结合使用,例如:提供事件处理程序。

答案 2 :(得分:1)

为了实现强大的Composition关系,我们选择inner classes

修改

一个人有heart所以当Man的对象被构​​造的同时构建了heart的对象。Heart对象范围没有人类身体的意义所以Heart类应该{ {1}} inner类的课程。

答案 3 :(得分:1)

由于Java没有多重继承,因此内部类非常方便。例如:

class Vehicle{
}

class Transporter{
}

//you cant create class like this
//class Car extends Vehicle, Transporter {}

//but you can create something like that
class Car extends Vehicle{

    class InnerTransporter extends Transporter{}

}

这不是一个完美的例子(为什么Transporter不会扩展车辆?),但我希望你有这个想法。

那么内部接口呢?例如

class View{

    public static interface OnClickListener{ //this interface associated with View, so it's more readable
        public void onClick();
    }

}

答案 4 :(得分:1)

之前已经解决了,让我引用其中一个good reasons

  

使用内部接口的一个很好的理由是它的函数与它所在的类[或接口]直接相关。一个很好的例子就是一个监听器。如果你有一个类[或接口] Foo,并且你希望其他类[或接口]能够监听它上面的事件,你可以声明一个名为FooListener的接口,这没关系,但是声明它可能会更清楚一个内部接口,并让其他类[接口]实现Foo.Listener

答案 5 :(得分:1)

样本:

http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html

我想因为入口界面与Map紧密相关,API设计者决定让Entry成为Map的内部接口而不是顶级接口。

在实践中,内部接口是规则的例外,但是。