用Case类生成模板代码
将类定义为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类生成模板代码的更多相关文章
- Android Studio 配置快速生成模板代码
前言 Android studio 有提供快速生成模板代码的功能,其实这个功能也可以自定义配置.此篇博客将讲解如何使用此功能 进入Settings 选择 Editor > Live Templa ...
- C# T4 模板 数据库实体类生成模板(带注释,娱乐用)
说明:..,有些工具生成实体类没注释,不能和SqlServer的MS_Description属性一起使用,然后照着网上的资源,随便写了个生成模板,自娱自乐向,其实卵用都没有参考教程 1.htt ...
- MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...
- [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...
- FreeMarker之根据模板生成Java代码
FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码". 比如Java中三层架构,数 ...
- 【VS外接程序】利用T4模板生成模块代码
引言 记得第一次做asp.net mvc项目时,可以用model直接生成Html的增删改查页面, 没什么特殊要求都可以不用修改直接用了, 觉得很神奇,效率太高了.后来在做客户端开发时,发现很多模块都是 ...
- [开源] FreeSql.AdminLTE.Tools 根据实体类生成后台管理代码
前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以 ...
- Java如何搭建脚手架(自动生成通用代码),创建自定义的archetype(项目模板)
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- SpringBoot获取Freemarker模板引擎,生成HTML代码
今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> < ...
随机推荐
- [.NET跨平台]Jexus独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...
- RecyclerViewLoadMoreDemo【封装上拉加载功能的RecyclerView,搭配SwipeRefreshLayout实现下拉刷新】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装含有上拉加载功能的RecyclerView,然后搭配SwipeRefreshLayout实现下拉刷新.上拉加载功能. 在项目中将 ...
- Python获取网络中的存活主机以及哪些主机是Linux
这个脚本用于扫描网络中的存活主机,通常在CMDB中自动获取主机的时候用到. #!/usr/bin/env python # -*- coding: utf-8 -*- ""&quo ...
- 强化学习(九)Deep Q-Learning进阶之Nature DQN
在强化学习(八)价值函数的近似表示与Deep Q-Learning中,我们讲到了Deep Q-Learning(NIPS 2013)的算法和代码,在这个算法基础上,有很多Deep Q-Learning ...
- 微信小程序开发06-一个业务页面的完成
前言 接上文:微信小程序开发05-日历组件的实现 github地址:https://github.com/yexiaochai/wxdemo 这里来说一说我们的理念,我们也学习小程序开发有一周多了,从 ...
- python小技巧01递归解释内嵌
现假设有一份机器人配件名单 list[头部,躯干,肢体] 头部这个list又有鼻子眼睛嘴巴这些小零件 肢体这个list有胳膊,肩膀,手.手这个list又有3种手指 所以这个list详细写出是: lis ...
- HTTP Get与Post的本质区别
作者:Larry链接:https://zhuanlan.zhihu.com/p/22536382来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. GET和POST是HTT ...
- C++系列总结——继承
前言 前面讲了封装,但封装只是隐藏了类内部实现.如果使用多态隐藏类本身的话,只有封装是不够的,还需要继承. 继承 通过封装.我们把一些相关的函数和变量包裹在了一起,这些函数和变量就叫做类的成员函数和成 ...
- html和css的使用方法以及样式
布局步骤 第一步: 清除默认样式第二步: 划分模块第三步: 设置模块的大小以及位置第四步: 划分下一级模块 html和css 引入网页头像 <link rel="shortcut ic ...
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...