文档章节

Scala学习之类和属性篇(五):getter和setter方法

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/12/10 14:55
字数 720
阅读 1076
收藏 0

Scala会根据你定义属性时候使用的关键字:var,val,private来选择是否自动生成gettersetter方法。并且不允许你重写Scala的settergetter方法。如果你要重写这两个方法你会看到如下编译错误:

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(private var name: String) {
  def name = name
  def name_=(aName: String) {name = aName}
}

// Exiting paste mode, now interpreting.

<console>:12: error: overloaded method name needs result type
         def name = name
                    ^
<console>:13: error: method name_= is defined twice
  conflicting symbols both originated in file '<console>'
         def name_=(aName: String) {name = aName}
             ^

Scala默认对于Person类的name属性,自动生成的gettersetter方法名分别是namename_=。但是你可以变通的用另一种方式来避开Scalasettergetter方法名规范,比如我们把name属性名改为_name那么这个时候Scala默认生成的getter和setter方法是_name_name_=,你只要不用这两个方法名就可以了。

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(private var _name: String) {
  def name = _name
  def name_=(aName: String) {_name = aName}
  override def toString = s"name is $name"
}

// Exiting paste mode, now interpreting.

defined class Person

scala> val p = new Person("Li Ming")
p: Person = name is Li Ming

因为name属性是private var修饰的,所以它是可变,再加上我们定义了自己的getter方法。我们可以改变并获取name属性值。

scala> val p = new Person("Li Ming")
p: Person = name is Li Ming

scala> p.name = "Wang Wei"
p.name: String = Wang Wei

scala> p.name
res2: String = Wang Wei

我们来看一下反编译后的class文件中的getter和setter方法,你会看到一个getter方法:symbol();一个setter方法symbol_$eq。这就是Scala生成getter和setter的规范。

class Stock (var symbol: String)

public class Stock extends java.lang.Object{
  public java.lang.String symbol();
  public void symbol_$eq(java.lang.String);
  public Stock(java.lang.String);
}

总结一下:重定义Scala默认生成的getter和setter方法,我们需要注意下面几点。

  • 使用private var关键字修饰构造方法参数,一般在参数名前加上下划线“_”。
  • 定义getter和setter方法:getter方法使用“参数名”命名;setter方法使用“参数名_="来命名。

一定记住要使用private关键字来修饰构造方法参数,否则Scala会生成一对默认的getter和setter方法。

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Stock (var _symbol: String) {
  def symbol = _symbol
  def symbol_=(s: String) {
    this._symbol = s
    println(s"symbol was updated, new value is $symbol")
  }
}

// Exiting paste mode, now interpreting.

defined class Stock

反编译生成的class文件,你会发现除了你自己定义的getter和setter方法外,Scala还为你生成了一对默认的getter和setter方法。

public class Stock extends java.lang.Object{
  //Scala自动生成的getter和setter方法
  public java.lang.String _symbol(); 
  public void _symbol_$eq(java.lang.String); 
  //自定义的getter和setter方法
  public java.lang.String symbol();
  public void symbol_$eq(java.lang.String);
  public Stock(java.lang.String);
}

使用private关键修饰后,反编译生成的class文件。

public class Stock extends java.lang.Object{
  public java.lang.String symbol();
  public void symbol_$eq(java.lang.String);
  public Stock(java.lang.String);
}

 

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
Scala笔记整理(三):Scala面向对象—类详解1

[TOC] getter和setter 简单类和无参方法 需要说明的是,官方给出的参考资料对于这方面讲解得十分详细,目前入门来说,不需要达到这样的理解,只需要可以进行开发即可,这一部分我给出的是官方...

xpleaf
2018/04/20
0
0
Scala学习目录

字符串篇 1.1 字符串的比较 1.2 使用多行字符串 1.3 字符串的切分 1.4 插值函数 1.5 逐字符处理字符串 1.6 使用正则表达式 1.7 访问字符串特定位置的字符 1.8 使用隐式方法来扩展字符串类 2....

阿拉德大陆的魔法师
2016/04/20
367
0
用Slick持久化ScalaFxBean

一直想给ScalaFX找一个合适的持久曾框架,要越方便越好。 接触Scala之前玩的是JavaFX,曾用熟悉的Mybatis写持久层,JavaFxBean的Properties不能用IDE自动生成用于Mybatis的getter和setter。比...

Ellipse
2013/03/20
362
0
Scala primary && secondary constructor

Scala primary && secondary constructor Scala定义的类 package com.usoft /** * 不使用var 和 val 进行属性字段的声明 /class Person(name: String, age: Int) { def sayHi(): String = ......

秋风醉了
2015/08/08
61
0
Objective C 的setter赋值函数视频基础提高课程(三)

腾讯视频 Objective C 的setter赋值函数 链接:http://dwz.cn/zH6nM 一、setter和getter的一般写法 setter和getter器可以说是一个类最基本的东西,任何一门面向对象的语言,都又这个概念,C...

马洪伟
2015/01/05
22
0

没有更多内容

加载失败,请刷新页面

加载更多

查看线上日志常用命令

cat 命令(文本输出命令) 通常查找出错误日志 cat error.log | grep 'nick' , 这时候我们要输出当前这个日志的前后几行: 显示file文件里匹配nick那行以及上下5行 cat error.log | grep -C ...

xiaolyuh
37分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
44分钟前
5
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
51分钟前
6
0
flutter 剪切板 复制粘贴

复制粘贴功能 import 'package:flutter/services.dart'; Clipboard.setData(ClipboardData(text:_text));Clipboard.getData;...

zdglf
53分钟前
4
0
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?

面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费...

米兜
54分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部