java traits or mixins pattern?

前端 未结 8 2205
小蘑菇
小蘑菇 2020-12-16 14:02

Is there a way to emulate mixins or traits in java? basically, I need a way to do multiple inheritance so I can add common business logic to several classes

8条回答
  •  臣服心动
    2020-12-16 14:05

    You can exploit the fact that interfaces allow nested classes (automatically public static) to keep the default implementation of the interface methods encapsulated within the interface itself. I.e. move the BusinessLogic class of Alex B's example inside the interface.

    This is similar to the way Scala generates the JVM code for traits as explained here How are Scala traits compiled into Java bytecode?

    When doing this the example becomes:

    interface BusinessLogicInterface {
        void method0();
    
        class DefaultImpl {
            private DefaultImpl() {
            }
    
            public static void method1(BusinessLogicInterface self) { ... }
            public static void method2(BusinessLogicInterface self) { ... }
        }
    
        void method1();
        void method2();
    }
    
    class User extends OtherClass implements BusinessLogicInterface {
        @Override
        void method0() { ... }
    
        @Override
        void method1() { BusinessLogic.defaultImpl.method1(this); }
    
        @Override
        void method2() { BusinessLogic.defaultImpl.method2(this); }
    }
    

    Note that we pass an object of the interface type as the "self" parameter. This means the business logic can use other abstract methods (method0). This can be very useful for creating a trait with abstract methods that are all orthogonal to each other and utility "extension" methods that may be implemented in terms of these orthogonal methods.

    The drawback is that each interface must copy/paste the boilerplate delegation code. Another often used pattern in Java without this drawback (but with less cohesion and less OO way to call the methods) is to create a class with the plural name as the interface containing the static methods, this is used in the Collections utility class.

提交回复
热议问题