scala classとJava class

3756 ワード

最近、データサービスプロジェクトでは、プロジェクト全体がspring mvcアーキテクチャですが、より多くのデータとの付き合いを考慮すると、scalaの関数式プログラミングはmap、filterなどの高度な関数とデータ操作にとって、不器用なJavaに比べて通俗的で、コード全体の量も少なくなります.そこでmaven環境でscala環境を構成し,dao層とservice層でscala codeを用いた.中にはいくつかの穴があった.その中でscala class問題は長い間付きまとうので、記録する必要があると思います.
scala class
Javaと同様にclassキーワードで定義されたクラスです.
class User

val user1 = new User

Userのデフォルトには、パラメータなしのコンストラクション関数があります.
class Point(var x: Int, var y: Int) {
  def move(dx: Int, dy: Int): Unit = {
    x = x + dx
    y = y + dy
  }
}

val point1 = new Point(2, 3)

Pointクラスには、3つのメンバー、x、y変数、move関数があります.コンストラクション関数classで定義(var x:Int,var y:Int)では、2つのIntパラメータが受け入れられます.Javaでは、パラメータのあるコンストラクション関数が定義されていれば、明示的に非パラメトリックコンストラクション関数が定義されていなければ、非パラメトリックコンストラクション関数は存在しません.同様にPointクラスが定義されている場合、x,y属性が追加されると、Pointには2つのパラメータのコンストラクション関数があり、対応する非パラメトリックコンストラクション関数が使用されます明示的な定義が必要です.定義されていない場合は、パラメトリックコンストラクション関数はありません.spring jdbcTemplateがsqlクエリに対してclassにマッピングを返す場合、classを反射する必要があり、インスタンスオブジェクトの場合、Classを使用する.newInstance()メソッドは、newInstanceメソッドで、当期classに無パラメトリック構造メソッドがなければ、変化してInstantiationException異常を放出します.
 * @throws  IllegalAccessException  if the class or its nullary
 *          constructor is not accessible.
 * @throws  InstantiationException
 *          if this {@code Class} represents an abstract class,
 *          an interface, an array class, a primitive type, or void;
 *          or if the class has no nullary constructor;
 *          or if the instantiation fails for some other reason.

これはnewInstance()メソッドが異常を投げ出す場合で、「if the class has no nullary constructor」では、newInstanceメソッドでオブジェクトをインスタンス化する場合、classにはパラメトリック関数の有無が必要です.scalaを使用してclassを定義する場合、関数ヘッダを定義するときに属性が指定されている場合、デフォルトではパラメトリック関数の有無はありません.パラメトリック関数を追加する必要がある場合は、this()関数を定義します.
class Point(var x: Int, var y: Int) {
    def this(){
      this(0,0)
    }
}

this(Int,Int)を呼び出すことで、this()無パラメトリック構造関数の定義を実現します.しかし、ポイントを定義するときにclassヘッダで属性を定義しない場合は、パラメトリック構造関数が1つしかありません.パラメータ構造関数を定義したい場合は、this()でthis(Int,Int)を実現したい場合は、しばらく方法が見つかりません.公式サイトclass tourのConstructors章では、属性値にデフォルト値を設定し、オブジェクトをインスタンス化する際にパラメータを少なくしたり、パラメータを付けない場合があります.scalaのデフォルト値の構文糖だけです.Javaコードでこのオブジェクトをインスタンス化すると、2つのパラメータしかないコンストラクション関数で、コンストラクション関数と1つのパラメータのないコンストラクション関数はありません.
class Point(var x: Int = 0, var y: Int = 0)

val origin = new Point  // x and y are both set to 0
val point1 = new Point(1)
println(point1.x)  // prints 1

var、val、private、 @BeanProperty
パラメータの前にvarで修飾すると、scalaはsetterとgetterメソッドを生産しますが、setXのような関数名ではありません.setXのような関数名を望む場合は、@BeanPropertyを使用して属性を修飾します.val修飾はgetterメソッドのみです.val修飾の属性は可変ではないからです.また、プロパティの前にprivateキーワードを追加すると、setterメソッドとgetterメソッドがブロックされます.
PS:fastjson gson jaskjson対scalaオブジェクトシーケンス化問題
springで@ResponseBodyはオブジェクトをjsonに変換してフロントエンドに戻るので、xmlで構成できるjson変換器はどのようなものですか.その他の問題が発生しました.
  • fastjsonオブジェクトを空に変換する理由は、fastjsonがオブジェクトをシーケンス化する際にclassにgetterが必要なようで、setterメソッド(これはシーケンス化プロセスを具体的に検討することができ、gsonはclassにgetter/setterメソッドが必要なくてもシーケンス化することができる)ので、scala classプロパティに@BeanProperty注釈を加えるとよい.
  • プロジェクトではswaggerドキュメント化が使用されているため、swaggerはjsonにjacksonシーケンス化形式でシーケンス化を要求するため、原則としてJacksonが最もサポートされているが、その後issueという人がいるためfastjsonサポートに参加したが、gsonはサポートされていない.issue 1608では計画中であるべきだという人がいる.最終的にプロジェクトアーキテクチャは同僚が構築したため、彼の構造を変更しないために、最終コントローラ変換でfastjson変換を選択したため、scala classの各属性に@BeanProperty注釈を追加する必要がある.

  • case class
    caseキーワードを使用したクラス定義がcase classesです.このキーワードを使用すると、Scalaコンパイラは定義したクラスのメンバーを自動的に生成します.まず、コンパイラはcase classの同じ名前のオブジェクトコンストラクタ(object construction)を生成します.つまり、new Var(「x」)を使用することなく、Var(「x」)を使用してクラスのインスタンスを作成することができ、objectのapplyメソッドを呼び出すことができます.
    case class Var(name:String)
    val x = Var("x")
    

    その他の使い方はclassと似ています.