博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8对混入的模拟
阅读量:4953 次
发布时间:2019-06-12

本文共 1557 字,大约阅读时间需要 5 分钟。

我们用8来通过 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/archive/2012/08/15/2640509.html

你可能感兴趣的文章
Upselling promotion stored procedure
查看>>
mysql编码配置
查看>>
KVM地址翻译流程及EPT页表的建立过程
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码...
查看>>
程序员如何提高影响力:手把手教你塑造个人品牌
查看>>
身份证校验原理和PHP实现
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>