将类定义为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. .NetCore WebApi——Swagger简单配置

    在前后端分离的大环境下,API接口文档成为了前后端交流的一个重点.Swagger让开发人员摆脱了写接口文档的痛苦. 官方网址:https://swagger.io/ 在.Net Core WebApi ...

  2. 使用dom4j 解析xml文件

    //使用dom4j 解析xml文件,升级版,dom4j是对dom的封装 //重点 package com.offcn.utils; import java.io.File; import java.i ...

  3. 【Linux篇】--sed的用法

    一.前述 Sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 ...

  4. mysql的学习笔记(四)

    ---恢复内容开始--- 1.插入操作 INSERT (1)INSERT table_name(col_name,...) VALUES(...),(....) CREATE TABLE user( ...

  5. 【反编译系列】四、反编译so文件(IDA_Pro)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 安卓应用程序的开发语言是java,但是由于java层的代码很容易被反编译,而反编译c/c++程序的难度比较大,所以现在很多安卓应用程 ...

  6. [深度应用]·实战掌握PyTorch图片分类简明教程

    [深度应用]·实战掌握PyTorch图片分类简明教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com ...

  7. Python:鲜为人知的功能特性(上)

    GitHub 上有一个名为<What the f*ck Python!>的项目,这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性,并尝试讨论这些 ...

  8. jsom快速入门

    JSON JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,具有自我描述性.类似 XML, 但比 XML 更小 ...

  9. SLAM+语音机器人DIY系列:(八)高阶拓展——1.miiboo机器人安卓手机APP开发

    android要与ROS通讯,一种是基于rosbridge,另一种是基于rosjava库. 相关参考例子工程 rosbridge例子: https://github.com/hibernate2011 ...

  10. DSAPI 导出EXEDLL函数到字符串

    EXE或者DLL写好了,要开始写函数说明文档了,可是有时里面的函数太多,怎么能自动列出来呢?在DSAPI中提供了该功能(目前没有做参数类型导出,以后有时间会添加). 先准备一个已经写好的EXE或DLL ...