使用Groovy语法糖的时候,可以验证最终生成的代码
@Singleton(lazy = true)
class TheUnique {
private TheUnique() {println 'instance created!'}
def hello() {println 'hello'}
}
// 务必要加上这句触发单例的使用,groovy才会在生成的代码使用单例
TheUnique.instance.hello()
- 生成的代码:
@groovy.lang.Singleton(lazy = true)
public class TheUnique extends java.lang.Object {
private static volatile TheUnique instance
@groovy.transform.Generated
private TheUnique() {
if (instance != null) {
throw new java.lang.RuntimeException('Can\'t instantiate singleton TheUnique. Use TheUnique.instance')
}
}
public java.lang.Object hello() {
this.println('hello')
}
@groovy.transform.Generated
public static TheUnique getInstance() {
if (instance != null) {
return instance
} else {
synchronized (TheUnique) {
if (instance != null) {
return instance
} else {
return instance = new TheUnique()
}
}
}
}
}
契约式设计和能力式设计
- 契约式设计的拓展模式
// Java 习惯使用接口拓展
// 人类会搬东西
abstract class Human {
public abstract void helpMoveThings()
}
class Man extends Human {
@Override
void helpMoveThings() {
println 'man helpMoveThings'
}
}
class Women extends Human {
@Override
void helpMoveThings() {
println 'Women helpMoveThings'
}
}
def takeHelp(Human human) {
human.helpMoveThings()
}
new Man().helpMoveThings()
new Women().helpMoveThings()
- 拓展需求
定义一个会搬东西的大象, 但是大象不是人类,只能再寻找大象和人类的抽象 Helper (愿意帮忙的动物),让男人、女人、大象都实现这个抽象
interface Helper {
def helpMoveThings()
}
class Man implements Helper {
def helpMoveThings() {
println 'man helpMoveThings'
}
}
class Women implements Helper {
def helpMoveThings() {
println 'Women helpMoveThings'
}
}
class Elephant implements Helper {
def helpMoveThings() {
println 'Elephant helpMoveThings'
}
}
def takeHelp(Helper helper) {
helper.helpMoveThings()
}
takeHelp(new Man())
takeHelp(new Women())
takeHelp(new Elephant())
groovy 能提供能力设计,简化代码
// 基于能力的设计
class DuckMan {
def helpMoveThings() {
println 'DuckMan helpMoveThings'
}
}
class DuckWomen {
def helpMoveThings() {
println 'DuckWomen helpMoveThings'
}
}
class DuckElephant {
def helpMoveThings() {
println 'DuckElephant helpMoveThings'
}
}
def DuckTakeHelp(helper) {
helper.helpMoveThings();
}
DuckTakeHelp(new DuckMan())
DuckTakeHelp(new DuckWomen())
DuckTakeHelp(new DuckElephant())
能力设计相比契约设计的优缺点
- 优点:省掉了很多接口定义和抽象了定义,让程序员更关心业务逻辑。
- 缺点:接口和抽象类都能借助idea很方便的找到实现,更好的关心业务边界和追踪代码