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で提供される新しいレコード機能は、上記の問題を解決できます
    • Javaは盗用されたScalaのサンプルクラスです
    • もちろん、scalaはもともとjavaに基づいて開発されました

Scalaのケースクラス

  • ケースクラスには複数のケースがあり、その後に構築パラメータが続きます。
  • ケースオブジェクトはシングルトンです。
  • サンプルクラスを宣言すると、次のことが自動的に行われます。
    • コンストラクター内のすべてのパラメーターは、varとして明示的に宣言されていない限り、valになります(これは推奨されません)
    • 新しいキーワードなしで対応するオブジェクトを作成できるように、コンパニオンオブジェクトにapplyメソッドを提供します
    • パターンマッチングを機能させるためのunapplyメソッドを提供する
    • toString、equals、hashCode、およびcopyメソッドを生成します
  • 上記を除いて、サンプルクラスは他のタイプとまったく同じです。メソッドとフィールドを追加して拡張できます。
  • フォーマットを定義する
    • ケースクラスサンプルクラス名([var / val]メンバー変数名1:タイプ1、メンバー変数名2:タイプ2、メンバー変数名3:タイプ3)
  • たった1行のコード
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