位运算实现组合选项
位运算实现组合选项
在实际开发中常会用到选项,选项开启和关闭可以有效的控制代码执行逻辑。
对于选项,我们可以简单的用类的一个属性去判断。也可以使用一些编程技巧,通过一个数字来表示组合选项。
一个简单的例子如下:
1 | public class ByteOption { |
Java位移操作符
Java位移操作符
运算符<<
(左移),>>
(右移)和 >>>
(无符号右移)称为移位运算符。移位运算符的左侧操作数是要移位的值; 右侧操作数指定移位距离。下面是语法描述:
1 | ShiftExpression: |
n << s
的意思是n左移s个bit位,这相当于 n∗2s,注意溢出。n >> s
的意思是n带符号位右移s个bit位,若左操作数是正数,则高位补“0”,若左操作数是负数,则高位补“1”,这相当于 n/2s。n >>>s
的意思是不带符号右移,无论左操作数是正数还是负数,在高位都补“0”。- 如果n是正数,那么结果等同于
n >> s
- 如果n是负数,且类型是int,那么结果等同于
(n >> s) + (2 << ~s)
- 如果n是负数,且类型是long,那么结果等同
(n >> s) + (2L << ~s)
- 如果n是正数,那么结果等同于
按位补码运算符: ~
shift表达式的类型是左侧操作数的提升类型。
- 如果左手操作数的提升类型是int,则只使用右手操作数的五个最低位作为移位距离.
- 如果左侧操作数的提升类型是long,则只使用右侧操作数的六个最低位作为移位距离.
1 | 5 >> 32 == 5 |
参考
设计模式之控制反转
设计模式之控制反转
控制反转(Inversion of Control)是一种是面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度。其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。
在传统编程中,业务逻辑的流由静态绑定的对象确定。通过反转控制,流取决于在程序执行期间构建的对象图。这种动态流是通过抽象定义的对象交互实现的。此运行时绑定是通过依赖项注入或服务定位器等机制实现的。在 IoC 中,代码也可以在编译期间静态链接,但通过从外部配置读取其描述而不是在代码本身中直接引用来查找要执行的代码。
我们来看下,为什么说控制反转(IOC)是一种解耦:
- 在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
- 软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
控制反转和依赖注入的区别: IoC框架使用依赖注入作为实现控制反转的方式,但是控制反转还有其他的实现方式,所以不能将控制反转和依赖注入等同。