Class内的接口

时间:2011-10-07 14:40:25

标签: java oop class interface

Q1。我可以在java中的类中有一个接口吗?

Q2。我可以在界面中有一个类吗?

如果是,那么在哪种情况下应该使用这样的类/接口。

2 个答案:

答案 0 :(得分:9)

Q1。是的Q2。是。

  • 在您的课程中,您可能需要多个接口实现,这仅与此特定类相关。在这种情况下,使其成为内部接口,而不是公共/包私有

  • 在您的界面中,您可以定义一些供实现和客户使用的数据持有者类。

后者的一个例子:

public interface EmailService {

    void send(EmailDetails details);

    class EmailDetails {
        private String from;
        private String to;
        private String messageTemplate;
        // etc...
    }
}

答案 1 :(得分:2)

我面临为实现接口的所有类提供常见的复杂操作,显然使用了接口的操作。

直到Java 8没有...

请参阅http://datumedge.blogspot.hu/2012/06/java-8-lambdas.html(默认方法)

解决方法是:

public interface I
{
    public Class U{
        public static void complexFunction(I i, String s){
             i.f();
             i.g(s) 
        }
    }
}

然后您可以轻松调用常用功能(导入I.U后)

U.complexFunction(i,"my params...");

可能会进一步细化,有一些更典型的编码:

public interface I
{
    public Class U{
        I me;
        U(I me){
            this.me = me;
        }

        public void complexFunction(String s){
             me.f();
             me.g(s) 
        }
    }
    U getUtilities();
}

class implementationOfI implements I{
    U u=new U(this);
    U getUtilities(){ return u; }
}

然后调用

I i = new implementationOfI();
i.getUtilities().complexFunction(s);

进一步的辛辣技巧

  1. 将U视为抽象,为本地实现U ...
  2. 的某些功能提供了机会
  3. 使用 I.this 重新实现U与本地类和本地构造函数,而不是强制参数传递...
  4. 使用静态U ...但是每个操作必须作为参数......
  5. 使用enum而不是class,仅用于静态函数,不需要任何其他对象(相当于第一种方法)
  6. 这样做的原因是将操作放在一个模块中,而不是让实用程序模块闲置,从而允许扩展最糟糕的重复实现。