【问题标题】:Interface inside Class类内部接口
【发布时间】:2011-12-03 01:56:15
【问题描述】:

第一季度。 java中的类里面可以有接口吗?

第二季度。我可以在接口中拥有一个类吗?

如果是,那么在什么情况下应该使用这些类/接口。

【问题讨论】:

    标签: java oop class interface


    【解决方案1】:

    第一季度。是的 Q2。是的。

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

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

    后者的一个例子:

    public interface EmailService {
    
        void send(EmailDetails details);
    
        class EmailDetails {
            private String from;
            private String to;
            private String messageTemplate;
            // etc...
        }
    }
    

    【讨论】:

    • 所以像接口中定义的变量是静态的,这个类也是静态的还是什么???如何在接口内实例化此类以及如何访问它的任何代码 sn-p?
    • new EmailService.EmailDetails()
    • 也许有些人感兴趣,一个内部类可能会以static void sendLater(EmailService details, Date d){...} 的形式提供通用操作,允许es.EmailDetails.sendLater(this,dateLater);
    【解决方案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. 使用 I.this 使用本地类和本地构造函数重新实现 U,而不是强制参数传递...
    3. 使用静态 U...但是每个操作都必须以 I i 作为参数...
    4. 使用枚举代替类,仅用于静态函数,不需要任何其他对象(相当于第一种方法)

    这样做的原因是将操作放在一个单独的模块中,而不是让实用程序模块挂在周围,从而允许可扩展的最糟糕的重复实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多