Scala クラスについて。Javaのクラスとはだいぶ様相が違うみたい

f:id:ts0818:20190826152634j:plain

間葉系幹細胞(かんようけいかんさいぼう、Mesenchymal stem cell)は、中胚葉性組織(間葉)に由来する体性幹細胞間葉系に属する細胞への分化能をもつ。血管心筋の再構築などの再生医療への応用が期待されている。採取する組織により特性が異なるため、採取する組織ごとに骨髄由来幹細胞(bone marrow stem cell)、脂肪組織由来幹細胞(adipose-derived stem cell)などとも呼ばれる。

間葉系幹細胞 - Wikipedia

⇧  ってな感じで、

news.yahoo.co.jp

⇧  衝撃のニュース。

今まで有効な手段が無かった、神経再生について、驚くべき発展が!

web.sapmed.ac.jp

⇧  高額療養費制度 を受けられるらしいですが、まだ、臨床例が少ないので、どうなるかは分からないのですが、

ステミラック注は、受傷後31日以内を目安に骨髄液採取を実施することが可能な受傷後間もない脊髄損傷の患者を対象として、厚生労働省より条件および期限付き薬事承認を得ています。したがって、それ以外の疾患は治療の対象とはなりません。

脊髄損傷に対する再生医療等製品「ステミラック注」を用いた診療について |お知らせ |札幌医科大学附属病院

⇧ とあるように、条件が厳しい状態ですかね。 

札幌医科大学附属病院では、ニプロ株式会社と共同開発した再生医療等製品「ステミラック注(一般的名称:ヒト(自己)骨髄由来間葉系幹細胞)」を用いた脊髄損傷に対する診療について、5月13日(月)より治療の申込みを開始しています。

脊髄損傷に対する再生医療等製品「ステミラック注」を用いた診療について |お知らせ |札幌医科大学附属病院

⇧ 2019年5月13日(月)より、治療の申込が開始されたようです。

有効性が確認される事例が増えていけば、希望の光となりそうです。

人間が永遠の命を持つことができる技術も夢ではなくなりそうな、科学のパラダイムシフトが起こってくれると良いですね。


ミスター・ノーバディ(字幕版)

⇧  「ジャコ・ヴァン・ドルマル 監督」 の映画は、人間が永遠の命を持つようになった2092年という設定ですね。

  

脱線しましたが、Scala について勉強していきたいと思います。そんでは、レッツトライ~。

 

Scalaのクラス

Java のクラスとは、だいぶ変わってるみたい。

www.ne.jp

⇧  上記サイト様が詳しいです。

んで、クラスとは関係ないんだけど、Scala の場合の通常のプロジェクト構成ってどんな感じなのかな?って思っていたところ、

www.scala-sbt.org

小さいプロジェクトはともかくとして、通常のプロジェクトでは src/main/ 以下のディレクトリにソースを入れて整理するのが普通だ。 

sbt Reference Manual — ディレクトリ構造

⇧  ってなことになるらしい。

hiro-aratani.hatenablog.com

⇧  上記のサイト様で、自作クラスなどは、「src/main/」 の配下にディレクトリ作成して配置すればOKって仰っていますね。

そんでは、IntelliJ IDEA を起動して、src/main 直下にディレクトリを作成しますか。

プロジェクトは、前に作成した、Scala プロジェクトを使っております。 

ts0818.hatenablog.com

⇧  この時の記事ですね。

そんでは、src/main ディレクトリを選択した状態で右クリックし、「New」>「Directory」で。

f:id:ts0818:20190826165029p:plain

適当に、作成するディレクトリの名前を入力し、「OK」で。

f:id:ts0818:20190826165906p:plain

ディレクトリ作成できたらば、「Mark Directories as」>「Sources Root」で。(←ディレクトリ作成するたびに、しなきゃならんのだろうか...)

f:id:ts0818:20190826171406p:plain

そしたらば、Scalaファイルを作成で。

f:id:ts0818:20190826171533p:plain

適当な名前を入力して、Enter で。

f:id:ts0818:20190826171655p:plain

んで、ソースコードを編集してみようと思うんだけど、Javaみたいにコンストラクタを複数定義する場合、Scala のクラスでは記述方法が異なると。

qiita.com

⇧  上記サイト様によりますと、

class ProductDTO(elems: List[Map[String, String]]) {

  // 補助コンストラクター(auxiliary constructor)
  def this(singleMap: Map[String, String]) = {
    this(List(singleMap))
  }

  // 補助コンストラクター(auxiliary constructor)
  def this(mapKey: String, mapValue: String) = {
    this(List(Map(mapKey -> mapValue)))
  }
}    

ってな感じになるらしい。class の引数にあたる部分が、「基本コンストラクター(primary constructor)に、引数を持たせ場合の記述」ってことらしい。

Javaだと、引数ありのコンストラクタを記述した場合、明示的にデフォルトコンストラクタをクラス内に記述してあげないとデフォルトコンストラクタを使えなくなるんだけど、Scala の場合ってどうなるんだろう?

class ProductDTO() {

  private var name: String = _
  private var description: String = _
  private var price: BigDecimal = _

  def getName(): String = {
    return name
  }

  def getDescription(): String = {
    return description
  }

  def getPrice(): BigDecimal = {
    return price
  }

  def setName(name: String){
    this.name = name
  }

  def setDescription(description: String) {
    this.description = description
  }

  def setPrice(price: BigDecimal) {
    this.price = price
  }

  // 補助コンストラクター(auxiliary constructor)
  def this(singleMap: Map[String, Any]) = {
    this()
    setName(singleMap.getOrElse("name", "nothing").asInstanceOf[String])
    setDescription(singleMap.getOrElse("description", "nothing").asInstanceOf[String])
    setPrice(singleMap.getOrElse("price", BigDecimal.defaultMathContext).asInstanceOf[BigDecimal])
  }
}

みたいにすれば、引数付きのコンストラクタを定義したとしても、デフォルトコンストラクタっぽいことが可能みたい。(TestClassを作成してます。)

f:id:ts0818:20190826191124p:plain

これで、引数なしのコンストラクタ、引数付きのコンストラクタの両方を呼べるようです。

TestClass のソースコードを修正します。

object TestClass {
  def main(args: Array[String]): Unit ={
    var product: ProductDTO = new ProductDTO
    var prodcut01 : ProductDTO = new ProductDTO(
      Map("name"-> "gyoza", "description"-> "餃子", "price"->BigDecimal(19.80))
    )
    println(prodcut01.getName() + " " + prodcut01.getDescription() + " " + prodcut01.getPrice())

  }
}

んで実行してみる。

f:id:ts0818:20190826194256p:plain

コンソールに表示されました。

f:id:ts0818:20190826194914p:plain

Scalaで、getterやsetter を使って良いのかがよく分からんのだけど、
www.geeksforgeeks.org

⇧  使ってる人もおると。

Scala の設計思想が分からんので、何とも言えないけど。

あと、

変数・定数・メソッド等の宣言(val・var・def・type)において「= ~」を書かなかった場合、抽象フィールド・抽象メソッドを定義したことになる。
つまり、そのクラスを継承した子クラス(具象クラス)で実際に値(本体)を定義する必要がある。

間葉系幹細胞 - Wikipedia

⇧  ってな感じで、Javaと違って、抽象フィールドって概念があるので、要注意ですかね。

複数コンストラクタを使う場合は、

xerial.org

⇧ object内に、factory method を作成したほうが良いそうです。

 

Scala 難しいな~。

今回はこのへんで。