将类定义为case类会生成许多模板代码,好处在于:

①会生成一个apply方法,这样就可以不用new关键字创建新的实例。

②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法。如果是var也会有修改方法。

③会生成一个默认的toString的方法。

④会生成一个unapplay方法,在模式匹配时很好用。

⑤会生成equals和hashCode的方法。

⑥会生成copy的方法。

举个栗子:

①定义case时,在也不用new关键字来创建实例了:

scala> case class Person(name: String,relation: String)
defined class Person scala> val emily = Person("Joker","niece")
emily: Person = Person(Joker,niece)

②case类的构造函数人数默认的是val,所以会自动生成访问方法,但不会有修改的方法。

scala> case class Person(name: String,relation: String)
defined class Person scala> val emily = Person("Joker","niece")
emily: Person = Person(Joker,niece) scala> emily.name
res1: String = Joker scala> emily.name = "Marray"
<console>:14: error: reassignment to val
emily.name = "Marray"

③把case类的构造函数参数声明为var,既有修改方法又有访问的方法。

scala> case class Company(var name: String)
defined class Company scala> val a = Company("beijing shuma gs")
a: Company = Company(beijing shuma gs) scala> a.name
res2: String = beijing shuma gs scala> a.name = "shanghai jixie gs"
a.name: String = shanghai jixie gs

④case类的toString的方法的实现。

scala> case class Company(var name: String)
defined class Company scala> val a = Company("beijing shuma gs")
a: Company = Company(beijing shuma gs) scala> a
res3: Company = Company(beijing shuma gs)

⑤case class会自动生成一个unapply的方法,当需要在匹配表达式中提取信息时会很好用。

scala> case class Animal(name:String,age: Int)
defined class Animal scala> val a = Animal("Dog",10)
a: Animal = Animal(Dog,10) scala> a match {
| case Animal(n,m) => println(n,m)
| }
(Dog,10)

⑥case也同时生成了equals和hashCode,这样实例就可以比较了。

scala> case class Animal(name:String,age: Int)
defined class Animal scala> val a = Animal("Dog",10)
a: Animal = Animal(Dog,10) scala> val b = Animal("Pig",10)
b: Animal = Animal(Pig,10) scala> a ==b
res5: Boolean = false scala> val b = Animal("Dog",10)
b: Animal = Animal(Dog,10) scala> a==b
res6: Boolean = true scala> a.hashCode
res7: Int = -24782408

⑦case类创建一个copy方法,但需要克隆一个对象时很有用,在克隆时可以修改某些字段。

scala> case class Animal(name:String,age: Int,sex: String)
defined class Animal scala> val a = Animal("Dog",10,"nan")
a: Animal = Animal(Dog,10,nan) scala> val b = a.copy()
b: Animal = Animal(Dog,10,nan)
scala>
scala> val c = a.copy(name="Pig",sex="nv")
c: Animal = Animal(Pig,10,nv)

用Case类生成模板代码的更多相关文章

  1. Android Studio 配置快速生成模板代码

    前言 Android studio 有提供快速生成模板代码的功能,其实这个功能也可以自定义配置.此篇博客将讲解如何使用此功能 进入Settings 选择 Editor > Live Templa ...

  2. C# T4 模板 数据库实体类生成模板(带注释,娱乐用)

     说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程    1.htt ...

  3. MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

    前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...

  4. [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

    本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...

  5. FreeMarker之根据模板生成Java代码

    FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码". 比如Java中三层架构,数 ...

  6. 【VS外接程序】利用T4模板生成模块代码

    引言 记得第一次做asp.net mvc项目时,可以用model直接生成Html的增删改查页面, 没什么特殊要求都可以不用修改直接用了, 觉得很神奇,效率太高了.后来在做客户端开发时,发现很多模块都是 ...

  7. [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码

    前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...

  8. Java如何搭建脚手架(自动生成通用代码),创建自定义的archetype(项目模板)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  9. SpringBoot获取Freemarker模板引擎,生成HTML代码

    今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> < ...

随机推荐

  1. ios的跨站脚本限制

    概述 项目中碰到一个问题,就是在ios机上,用iframe内嵌的网页有时需要登录,有时候又不需要登录.查找了半天,终于发现是ios的跨站脚本限制导致的.这里就来介绍下跨站脚本限制,供以后开发时参考,相 ...

  2. 我的第一个MyBatis

    (1)步骤:1.新建实体类对象---根据数据库字段来设计,有多少字段设多少变量,变量名要字段名一致.   2.新建配置文件config.xml---主要用来获取数据源,里面内容大致需要填写:数据库驱动 ...

  3. WebPack引用Bootstrap 无法使用图标的结局方案

    npm i https://github.com/iconic/open-iconic.git -D  因为boostrap的css里删除了图标 分开了 我们在引入个呵呵. 下载:npm i boot ...

  4. PermissionDialog【权限申请提示对话框】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 随着Android6.0的普及,权限申请也变成了我们开发中必写的一段代码.比如sd卡权限.定位权限.拍照权限,这些几乎都是每个app ...

  5. 【activity任务栈】浅析

    背景知识 Activity四种启动模式 标准模式 standard 栈顶复用模式 singleTop 栈内复用模式 singleTask 单例模式 singleInstance 任务栈 Activit ...

  6. mysql_8.0.12环境配置

    1. 官网下载mysql_8.0.12免安装包,解压到你存放的地方: 2. 配置环境变量(把bin的文件夹弄进系统path里面): 3. 在解压的根路径中,查看是否含有my.ini文件,没有就新建一个 ...

  7. 编程心法 之 怎么选择合适的IDE

    一般情况下,使用IDE进行开发可以极大的提高开发效率 最佳选择 如果语言是GNU开源的则Eclipse,因为Eclipse就是开源的 例如C和C++这样的底层语言并且经典的语言,基于GNU的语言,推荐 ...

  8. h5与c3权威指南笔记--css3新属性选择器

    [att*=val] 选择所有att属性值中包含val的.只要包含val值,不论val值在属性值的前面还是中间还是后面~ <style> div[class*=div]{ color: r ...

  9. js对数组进行删除

    今天在项目中遇到一个问题  就是一个json对象里边是一个个数组,用户点击选中会把选中的数据从原来的数据里边删除 想了想写了一段代码,如下 let json={title:1212,reader:10 ...

  10. 20190404-transition、transform转换、animation、媒体查询

    目录 1.transition过渡 1.1简写:transiton:transition-property | transition-duration | transition-timing-func ...