scala--面向对象-样例类-★★★★

Java中的JavaBean

  • 在Java中,如果要对数据进行封装,如封装学生对象信息,得创建如下的Student类
package cn.hanjiaxiaozhi.caseclassdemo;

/**
 * Author hanjiaxiaozhi
 * Date 2020/7/17 11:10
 * Desc
 */
public class Student_Java {
    
    
    private String name;
    private int age;
    private String address;
    
    public Student_Java(String name, int age, String address) {
    
    
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student_Java that = (Student_Java) o;

        if (age != that.age) return false;
        if (!name.equals(that.name)) return false;
        return address.equals(that.address);
    }

    @Override
    public int hashCode() {
    
    
        int result = name.hashCode();
        result = 31 * result + age;
        result = 31 * result + address.hashCode();
        return result;
    }

    @Override
    public String toString() {
    
    
        return "Student_Java{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}
  • 扩展:
    • java14中提供的record新特性可以解决上面的问题
    • java就是抄袭的Scala的样例类
    • 当然最开始scala是在java基础之上发展起来的

Scala中的样例类case class

  • case class是多例的,后面要跟构造参数,
  • case object是单例的.
  • 当你声明样例类时,如下几件事情会自动发生:
    • 构造器中的每一个参数都成为val,除非它被显式地声明为var(不建议这样做)
    • 在伴生对象中提供apply方法让你不用new关键字就能构造出相应的对象
    • 提供unapply方法让模式匹配可以工作
    • 将生成toString、equals、hashCode和copy方法
  • 除上述外,样例类和其他类型完全一样。你可以添加方法和字段,扩展它们。
  • 定义格式
    • case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)
  • 只要一行代码搞定
package cn.hanjiaxiaozhi.caseclassdemo

/**
 * Author hanjiaxiaozhi
 * Date 2020/7/17 11:13
 * Desc 
 */
//定义一个Scala的样例类
//用来封装name,age,address
//默认都是val修饰的,除非显示的声明为var,但一般不建议
//默认就提供了apply,方便创建对象,不用写new
//默认提供了equals,hashcode,toString...
//定义起来很简单,一行代码搞定
case class Student(name:String,age:Int,city:String)

object TestCaseClass{
    
    
  def main(args: Array[String]): Unit = {
    
    
    val s1 = new Student("张三",18,"北京")
    val s2 = Student("张三",18,"北京") //使用起来很简单
    println(s2.toString)//Student(张三,18,北京)
    println(s2)//Student(张三,18,北京)
    println(s2.hashCode())//-1453384308,底层重新的方法计算的hashcode
    println(s2.equals(s1))//true,样例类中的equals已经重写过了,默认比较的就是内容
    println(s2 == s1)//true,==在scala中比较的也是内容
    println(s2.eq(s1))//false, 在scala中eq比较的才是地址
  }
}
  • 样例类可以模拟出枚举类型
package cn.hanjiaxiaozhi.case_demo

object EnumDemo {
    
    
  def main(args: Array[String]): Unit = {
    
    
    for (color <- Array(Red, Yellow, Green))
      println(
        //模式匹配
        color match {
    
    
          case Red => "stop"
          case Yellow => "slowly"
          case Green => "go"
        })
  }
}
abstract class TrafficLightColor
case object Red extends TrafficLightColor
case object Yellow extends TrafficLightColor
case object Green extends TrafficLightColor

猜你喜欢

转载自blog.csdn.net/qq_46893497/article/details/114043322
今日推荐