【Groovy】《Groovy程序设计》笔记 ——调试技巧及基于函数能力的设计

使用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很方便的找到实现,更好的关心业务边界和追踪代码
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Groovy入门经典是一个唯一能够扩展Java平台的脚本语言,内容全面详尽,浅显易懂,易于选择性阅读。可以作为对Groovy语言感兴趣的计算机软件开发人员的参考书。需要的朋友们就赶紧来下载试试吧!   Groovy提供类似于Java的语法结构,本地化支持映射和列表、方法、类,闭包和构造器等结构。由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。   相对于Java语言Groovy语言的表述性更强,抽象程度更高。它使得应用程序开发更加快捷,提升了程序员生产力。Groovy语言可以用作应用程序的“黏合剂”,而不必实现复杂的数据结构和算法。   与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。   本书是有关Groovy的第一本正式出版物,作者KennethBarclay和JohnSavage介绍了Groovy开发的所有主要领域,并解释了这种创新性的编程语言给Java平台赋予的动态特性。阅读本书只要求具备Java编程的一般性知识。不管你是经验丰富的Java开发者,还是脚本语言的新手,都会得到如何充分利用Groovy语言的专家性指导。   本书特点第一本全面讲解Groovy编程的图书,演示如何快速和轻松地编写适用于Java平台的应用程序和脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值