• Scala基础入门-2


    简单类和无参方法

    class Counter {
      private var value = 0 // 必须初始化字段
      def increment() { value += 1 } // 方法默认公有
      def current() = value
    }
    

      

    Scala中的类不声明为public,一个Scala源文件中可以有多个类。

    val myCounter = new Counter // 或new Counter()
    myCounter.increment()
    

      

    调用无参方法时,圆括号是可写可不写的。推荐的做法是:如果是会改变对象状态的方法,就带上( );否则,就不带。

    如果将方法的声明改为以下形式,那么可以强制不能带( )(下面要提到的getter就是这种风格的,所以调用getter时,必须不带( )):

    带getter和setter的属性

    在Java中,通常将字段声明为私有的,然后添加公有的getter和setter方法来提供访问字段的接口。像这样拥有一对getter/setter的字段,通常被称为属性(property)。

    Scala对每个字段都提供了getter和setter方法。

    class Person {
      var age = 0
    }
    

      

    在面向JVM的类中,这个简单的Person类有一个私有的age字段和相应的,公有的getter和setter方法。(如果将age声明为private的,getter和setter方法也是私有的。)Scala中,getter和setter分别叫做age和age_=。

    println(fred.age) // 调用方法fred.age()
    fred.age = 21 // 调用方法fred.age_=(21)
    

      

    将这个简单的Person编译后,使用javap查看生成的字节码,可以验证这一点。

    // -private选项说明显示所有的类和成员
    javap -private Person.class
    

      

    public class Person implements scala.ScalaObject {
      private int age;
      public int age();
      public void age_$eq(int); // =号被翻译成了$eq
      public Person();
    }
    

      

    知道了这些默认实现后,就可以使用自己的实现来代替默认实现了。

    class Person {
      private var privateAge = 0
    
      def age = privateAge
      def age_=(newValue: Int) {
      	if (newValue > privateAge) privateAge = newValue
      }
    }
    

      

    Scala中,字段和getter/setter间的关系,还有其他几种情况。

    使用val声明的字段,是只有getter,因为val声明的是不可变的啊。Scala中不能实现只有setter的字段。

    还有种对象私有字段。Scala中,方法可以访问该类的所有对象的私有字段,这一点与Java一样。如果通过private[this]来字段来修饰,那么这个字段是对象私有的,这种情况下,不会生成getter和setter。对象私有字段,只能由当前对象的方法访问,而该类的其他对象的方法是无法访问的。如果说分不清楚对象和类的区别,这里就又要犯浑了。

    接下来是一种与private[this]相似的访问控制。Scala中可以使用private[class-name]来指定可以访问该字段的类,class-name必须是当前定义的类,或者是当前定义的类的外部类。这种情况会生成getter和setter方法。

    Bean属性

    使用 @BeanProperty注解来为字段生成符合JavaBeans规范的getter/setter方法。使用该注解后,将会生成4个方法:Scala的getter/setter和JavaBeans规范的getter/setter(如果是val声明,就没有setter部分了)。

  • 相关阅读:
    【函数】wm_concat包的订制
    【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)
    【技巧】如何使用客户端发布BLOG+如何快速发布微信公众号文章
    【故障处理】队列等待之TX
    【转载】TX
    【转载】Linux磁盘管理:LVM逻辑卷管理
    【索引】Oracle之不可见索引和虚拟索引的比对
    小麦苗微信公众号文章链接地址
    Oracle 11g新特性direct path read引发的系统停运故障诊断处理
    常识之外:全表扫描为何产生大量 db file sequential read 单块读?
  • 原文地址:https://www.cnblogs.com/spring87/p/4948629.html
Copyright © 2020-2023  润新知