1.27

如果需要覆盖默认的getter、setter,应将字段设为private,字段名一般为getter/setter名(即对外形式的字段名)前加下划线_,类中定义getter方法def ={},和setter方法def _=(s:Type){}。

通过注解@BeanProperty标注字段(或主构造器中的val/var参数)可(额外)生成java bean 风格的getter/setter(对val字段则只有getter)。

(类定义体中的)字段定义时不提供初始值则被认为是抽象字段(要求类是抽象类),对val/var字段皆如此,初始值可由代码块产生的返回值提供。

class P(val name:String, var age:Int) {
}
// $javap -private P.class
/* output ==>
public class P {
    private String name;
    public String name(){...}
    private int age;
    public int age(){...}
    public int age_$eq(int){...}
    public P(){...}
}
*/

object app extends App {
    val p=new P("Jack Ma", 54)
    println(p.name)
    p.age = 50      // in java, p.age_$eq(60)
    println(p.age)
}

package com.exmaple.access
class FieldAccessorExample( val age:Int /* public */){
    private var a = 0
    private[this] var b = 0  // this instance accessible
    private[access] var c = 0  // accessible in this ‘access’ package
    private[exmaples] var d = 0 // NOT be: private[com.exmaple]
    private[com] var d1 = 0
    // private[another] var dx = 0 // may NOT be other packages, neither subpackages
 }


// private[this|<Class>]
class Girl{
    private[this] var age:Int
    //! def isOlder(that:Person) :Boolean= this.age > that.age  // compilation ERROR, NOT accessible in other instances
}
class Girl{
    private[Girl] var age:Int
    def isOlder(that:Person) :Boolean= this.age > that.age  // OK
}

class JavaBeanExmaple (@BeanProperty var age:Int) {
    @BeanProperty var name:String = _
    // yield 4 methods: String name(); void name_$eq(String); String getName(); void setName(String);
}

// getter/setter customizing
class Person {
    private var _name: String = _
    private var _age: Int = _
    def name= _name
    def name_= (newName:String){
        if(newName=="Lady Gaga")throw Illegal("NOT allowed: her tracks are noisy")
        _name = newName
    }
}

// field declaration & initialization
class SomeClass{
    val text={
        var lines=""
        try{
            io.Source.fromFile("a.txt").getLines.mkString()
        }catch{
            case e:Exception=> lines="ERROR"
        }
        lines
    }
}
posted @   秋渡晚枫  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示