Java8对混入的模拟

我们用JAVA8来通过 VEM 实现一个混入效果,不过事先警告的是:请不要在工作中使用!

下面的实现不是线程安全的,而且还可能存在内存泄露问题,这取决于你在类中定义的 hashCode 和 equals 方法,这也是另外一个缺点,我将在后面讨论这个问题。

首先我们定义一个接口(模拟状态Bean)并提供方法的默认定义:
1    public interface SwitchableMixin {
2        boolean isActivated() default { return Switchables.isActivated(this); }
3        void setActivated(boolean activated) default { Switchables.setActivated(this, activated); }
4    }

然后我们定义一个工具类,包含一个 Map 实例来保存实例和状态的关联,状态通过工具类中的私有的嵌套类代表:
01    public final class Switchables {
02    
03        private static final Map<SwitchableMixin, SwitchableDeviceState> SWITCH_STATES = new HashMap<>();
04    
05        public static boolean isActivated(SwitchableMixin device) {
06            SwitchableDeviceState state = SWITCH_STATES.get(device);
07            return state != null && state.activated;
08        }
09    
10        public static void setActivated(SwitchableMixin device, boolean activated) {
11            SwitchableDeviceState state = SWITCH_STATES.get(device);
12            if (state == null) {
13                state = new SwitchableDeviceState();
14                SWITCH_STATES.put(device, state);
15            }
16            state.activated = activated;
17        }
18    
19        private static class SwitchableDeviceState {
20            private boolean activated;
21        }
22    
23    }

这里是一个使用用例,突出了状态的继承:
1    private static class Device {}
2    
3    private static class DeviceA extends Device implements SwitchableMixin {}
4    
5    private static class DeviceB extends Device implements SwitchableMixin {}
1    DeviceA a = new DeviceA();
2    DeviceB b = new DeviceB();
3    
4    a.setActivated(true);
5    
6    assertThat(a.isActivated()).isTrue();
7    assertThat(b.isActivated()).isFalse();

原文地址:https://www.cnblogs.com/sky7034/p/2640509.html