将类定义为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. 编辑器开发之 Selection 对象的学习

    上一篇,介绍了 range 对象的一些属性和方法,了解了一些基本操作,现在来介绍另外一个重要的对象:selection 对象: MDN 的解释是:Selection 对象表示用户选择的文本范围或插入符 ...

  2. 机器学习基石笔记:01 The Learning Problem

    原文地址:https://www.jianshu.com/p/bd7cb6c78e5e 什么时候适合用机器学习算法? 存在某种规则/模式,能够使性能提升,比如准确率: 这种规则难以程序化定义,人难以给 ...

  3. vue 传值 概述 个人理解

    1 父传子   子组件  props:[‘自定义属性名’]   父组件  v-bind:自定义属性名="值"  理解 子组件创建一个自定属性   父组件使用vue指令绑定到 自定义 ...

  4. 【Android Studio安装部署系列】四十一、Android Studio安装Alibaba Java Coding Guidelines插件(检查代码规范)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 该插件主要是对今年发布的<阿里巴巴 Java 开发规约>的一个延伸,它以一个 IDE 的插件存在,可以自动对手册中的 J ...

  5. IntentActionUtil【Intent的常见作用的工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要用于通过Intent调用手机本地软件打开文件(doc.xsl.pdf.ppt.mp3.mp4等格式).安装apk.发送邮件.拨打 ...

  6. springboot~Mongodb的集成与使用

    说说springboot与大叔lind.ddd的渊源 Mongodb在Lind.DDD中被二次封装过(大叔的.net和.net core),将它当成是一种仓储来使用,对于开发人员来说只公开curd几个 ...

  7. C++与Lua交互之配置&交互原理&示例

    |Lua 简介 Lua 是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放. 某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为. 而修改函 ...

  8. Python实战171202元组访问

    学生信息系统中数据为固定格式: (名字,年龄,性别,邮箱地址,......) 学生数量很大为了减小存储开销,对每个学生信息用元组表示: ('jim',18,'male','jim8765@gmail. ...

  9. 微软开发者大会:VS 2019 Preview 发布;Windows UX 主要技术开源

    美国当地时间12月4日,微软正式举行 Microsoft Connect(); 2018 开发者大会,本次大会的 slogan 是"Build the apps of tomorrow, t ...

  10. SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...