用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)

原文地址:https://www.cnblogs.com/zhaohadoopone/p/9459705.html

时间: 2024-11-06 10:55:48

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

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

前言 Android studio 有提供快速生成模板代码的功能,其实这个功能也可以自定义配置.此篇博客将讲解如何使用此功能 进入Settings 选择 Editor > Live Templates 创建一个自己的组 为了不与Android studio已经自带的模型代码混淆,我们创建一个自己的组来管理自己的模板代码,请看下图: 下图点击 + 号 ,有2个选择 1.第一个选择是在当前组里新建一个模板代码 2.第二个就是生成一个组,我已经创建了一个叫user的组 编辑代码模板 下图就是生成模板代

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

本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:HelloWorld.cs (二) 多文件生成 四.生成数据层实体相关相似代码 (一) 生成准备 (二) 生成实体相关相似代码 生成实体映射配置类 生成实体仓储接口 生成实体仓储实现 五.源码获取 系列导航 一.前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少

FreeMarker之根据模板生成Java代码

FreeMarker根据模板生成Java代码,光这句话,大家想必也知道它的应用了,比如流行的DRY原则,该原则的意思,可简单概述为"不要写重复的代码". 比如Java中三层架构,数据访问层,业务逻辑层,表现层,光这三层就出现重复性的增删改查及其相关的界面代码. 如何不写重复的增删改查相关的代码,可以参考我的MP实战系列文章和MyBatis的逆向工程(针对Java相关框架): mybatis逆向工程之maven工程 MP实战系列(六)之代码生成器讲解 其中MP实战系列(六)之代码生成器讲

牛腩新闻系统(四)——类生成器生成实体代码

之前代码基本都是自己写,但是有没有想过,如果能想EA图那样,画好基本的类图, 代码就出来了,那该多好呀! 嗯,这真就有这么一款小软件,能自动帮助我们生成实体类的代码,当然软件是可以 自己制作的.下面是牛腩新闻系统中在实体类中用"实体类生成器"生成代码的过程, 下面是具体的步骤: 1.按照相应的空格填好,类名.类说明 2.命名空间默认是无,填好实体名:Model,填写好相应的属性 比如id,name,相应的类型以及备注. 3.选择"新闻系统"所在的Model层.然后在

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

今天用Ajax异步添加评论,加载Freemarker模板引擎,生成模板模块 1.新建Freemarker模板 <li id="${comment.oId}"> <div> <div class="avatar tooltipped tooltipped-n" aria-label="${comment.commentName}" style="background-image: url(${comment.

基于spring-boot-data-jdbc的RowMapper实例的初始化配置,配置内容和实体类的代码由测试类生成

spring-boot-data-jdbc的RowMapper配置(windows10+jdk8+idea+spring-boot2.1.5)项目url:https://github.com/zhzhair/jdbcrowmapper-spring-boot.git 启动项目初始化RowMapper配置,配置内容由代码生成: 1.基于mysql的jdbcTemplate的crud:用户反馈,运营回复.忽略,多条件动态查询反馈信息等: 2.添加记录时返回自增主键,批量删除,启动项目实例化所有Row

grpc proto文件生成java、.net实体类以及客户端代码

背景 工作中对接对方服务是GRPC,对方只提供了proto契约文件,需要自己生成对应的实体类以及客户端代码,故记录下操作流程. Java 代码生成 实体类: 通过protoc插件生成实体类 在 https://github.com/protocolbuffers/protobuf/releases 下载对应版本的protoc工具解压,我这边用的是3.1.0版本的 proto文件拷贝至protoc同目录,执行如下命令: protoc --java_out=./java/ hello.proto 对

模板代码 - 列表和下拉刷新

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla