建议:对设置值的时候,即改变对象状态值或者状态时使用(),而对于取值来说(不会改变对象的状态和值)去掉()是个不错的风格,这也是我们事例中的方法。
personOps.increment() println("currentAge=> " + personOps.currentAge)结果:这样一来在调用时,必须要用不带()的进行方法调用 println(“currentAge=> ” + personOps.currentAge)
Java中属性定义
public class PersonAge{ //这是Java private int age; public int getAge() { return age; } public void setAge(int age) { this.age=age; } }getter和setter方式比共有字段(public)好在什么地方呢? 之所以说getter和setter方法比公有字段更好,是因为它们让你可以从简单的get/set机制出发,并在需要的时候做改进。
class PersonA{ var age = 0 }
Scala生成面向JVM的类,其中有一个私有的age字段以及相应的getter方法和setter方法。这两个方法是公有的,因为我们没有将age声明为private。而对私有字段而言,getter和setter方法也是私有的。 字段默认,调用默认set/get方法,如果字段私有,那么默认的getter/setter方法也将会是私有的,无法调用,但是我们可以自定义覆盖掉默认的
1、在任何时候你都可以自己重新定义getter和setter方法。例如: /** * 自定义getter和setter方式实现 */ class CustPerson{ private var privateAge =0 // 变成私有并改名 def age = privateAge def age_= (newValue: Int) { if (newValue > privateAge) privateAge=newValue // 不能变年轻 } } 注意事项:在自定义setter方法时,等号左边的方法名称和=之间不应该有空格,负责会出现变量未定义的错误。 调用: val custPerson = new CustPerson custPerson.age = 30 custPerson.age = 21 custPerson.age_=(50) println("custPersonAge=> " + custPerson.age) class SanMaoScala { var name: String =""; def getName(): String ={ name } } object SanMaoOps{ def main(args: Array[String]): Unit ={ var sm = new SanMaoScala; sm.name_=("sanmao") println(sm.name) } }字段私有,自己编写set/get方法
class SanMaoScala { private var name: String =""; def getName(): String ={ name } def setName(name: String):Unit = { this.name = name } } object SanMaoOps{ def main(args: Array[String]): Unit ={ var sm = new SanMaoScala; sm.setName("sanmao") println(sm.getName()) } }在Scala中,getter和setter分别叫做age和age_=例如:
val personA = new PersonA println("startAge=> " + personA.age) personA.age = 21 println("endAge=> " + personA.age) Scalac PersonOps.scala \src\main\scala\tw\tw>javap -p PersonA.class Compiled from "PersonOps.scala" public class tw.PersonA { private int age; public int age(); public void age_$eq(int); public tw.PersonA(); }正如你看到的那样,编译器创建了age和age_ eq方法。=号被翻译成 eq,是因为JVM不允许在方法名中出现= 说明:在Scala中,getter和setter方法并非被命名为getXxx和setXxx,不过它们的用意是相同的。后面会介绍如何生成Java风格的getXxx和setXxx方法,以使得你的Scala类可以与Java工具实现互操作
有时候你需要一个只读属性,有getter但没有setter。如果属性的值在对象构建完成后就不再改变,则可以使用val字段: //定义val声明的变量 val totalCount = 0 调用:custPerson.totalCount = 11(会抛出错误) 结论:Scala会生成一个私有的final字段和一个getter方法,但没有setter。 2和3)的一个小总结: 总结一下,在实现属性时你有如下四个选择: ■ var totalCount : Scala自动合成一个getter和一个setter ■ val totalCount : Scala自动合成一个getter ■ 由你来定义totalCount和totalCount _=方法 ■ 由你来定义totalCount方法 但在Scala中,你不能实现只写属性,即带有setter但不带getter的属性。当你在Scala类中看到字段的时候,记住它和Java或c++中的字段不同。它是一个私有字段,加上getter方法(对val字段而言)或者getter和setter了法(对var字段而言)
如果你不需要任何getter或setter,可以将字段声明为private[this] private[this] val totalCount = 0
//这是不允许的方式(因为跨实例访问) def compareAgeBetweenDiffPersons(personC : PersonCounter): Unit ={ if(totalAge > personC.totalAge){**//不能应用在别的实例上面,只能应用在此单一的实例上面** println("") } }把Java属性定义为一对getName/setName方法或者对于只读属性而言单个getName方法。许多Java工具都依赖这样的命名习惯。当你将Scala字段标注为@BeanProperty时,这样的方法会自动生成。例如:
/** * 用BeanProperty实现的getter和setter方法 */ import scala.reflect.BeanProperty class BeanPropertyPerson{ @BeanProperty var name:String = _ }调用:
val beanPropertyPerson = new BeanPropertyPerson() beanPropertyPerson.setName("jack") println("beanPropertyPerson.name=> " + beanPropertyPerson.getName) beanPropertyPerson.name = "Garry" println("scala.beanProperty.person.name=> " + beanPropertyPerson.name)将会生成四个方法: ■ name:String ■ name_=(newValue: Strmg):Unit ■ getName():String ■ setName(newValue: String): Unit
object(参数1,…,参数N) 通常,这样—个apply方法返回的是伴生类的对象
class PersonApplyTest{ private var balance = 0 def apply() = println("your person apply class test") def initPersonNumber:Int = { balance += 1 balance } } object PersonApplyTest{ def apply () = { println("Please init your person information") new PersonApplyTest } } 调用: 1、val personApplyTest = PersonApplyTest() println(personApplyTest.initPersonNumber) 2、val personApplyTest = new PersonApplyTest println(personApplyTest.initPersonNumber) personApplyTest()object PersonClothesColor extends Enumeration{ val Red,Yellow,Green = Value }
1)定义完成后,你就可以用PersonClothesColor.Red、PersonClothesColor.Yellow等来引用枚举值了。 2)需要注意的是:枚举的类型是PersonClothesColor.Value而不是PersonClothesColor,后者是握有这些值的对象。有人推荐增加一个类型别名:
for(c <- PersonClothesColor.values){ println(c.id +”:” + c) }
println(PersonClothesColor(0)) println(PersonClothesColor.withName(“Yellow”))