Chapter 10注記


Chapter 10この節はやはり重要で、Sparkのソースコードを見る過程で、そのソースコードが多くの注釈の知識を使っていることを発見したので、この節は必ずよく勉強しなければなりません.
1.注釈とは
  • 注記:ツールが処理できるようにコードに挿入されたラベルです.
  • 注釈の役割:注釈された式、変数、フィールド、メソッド、またはタイプを記述します.
  • Javaでの注釈はコンパイラがバイトコードを生成することに影響しませんが、Scalaでは影響します.
  • 以下は注釈の簡単な例である:
  •     import scala.reflect.BeanProperty
        import javax.persistence.Entity
        import javax.persistence.Id
        import org.junit._
        import org.junit.Assert._
    
        @Entity class Credentials {
          @Id @BeanProperty var username : String = _
          @BeanProperty var password : String = _
        }
    
        class MyTest {
          @Test(timeout = 100) def testSomeFeature() {
            assertTrue(6 * 7 == 42)
          }
        }
    @Entity注釈はクラスがエンティティであることを識別し、@idはプライマリ・キーを設定し、@BeanPropertyはChapter 05で述べたように、getterとsetterの2つの方法を生成し、@Testはテスト方法を示し、ここで所望の異常とタイムアウト時間をテストすることができる.具体的な意味はgoogleでJunitとJPAの注釈を調べることができます.
    2.何が注釈できるか
  • クラス、メソッド、フィールド、ローカル変数、およびパラメータに注釈を追加できます.
  • は、複数の注釈を追加することができ、前後順はありません.
     @BeanProperty @Id  var lastName = ""
    
  • プライマリコンストラクタに注記を追加すると、注記はコンストラクタの前に配置され、カッコのペアが加算されます.
    class Credentials @Inject() (var username: String, var password: String) { 
    }
    
  • 式に注釈を追加するには、式の後にコロンを追加し、注釈を追加する必要があります.
    (n: @unchecked) match { ... }
    

  • 3.注記パラメータ
  • 注記にはパラメータを付けることができます.
    @Test(timeout = 100, expected = classOf[IOException]) 
    def testNonexistentFile() {     
        new FileReader("/fred.txt")
      }
    
  • 注記はパラメータを持たず、カッコは省略できます.注記には、TestのTimeoutのデフォルト値が0などのデフォルト値があり、タイムアウトがないことを示し、expectedのデフォルトでは異常は予想されません.

  • 4.Java特性に対する注釈
  • @volatileは、フィールドを揮発性としてマークし、揮発性フィールドを複数のスレッドによって同時に更新することができる.
  • @transientはフィールドを過渡的とマークし、過渡的なフィールドはシーケンス化されず、一時的なキャッシュデータとしてのみ使用されます.(シーケンス化:オブジェクト状態情報を記憶または伝送可能な形式に変換するプロセス)
  • .
  • @strictfp IEEEのdoubleを使用して浮動小数点計算を行い、80ビット拡張精度を使用するのではなく、計算は遅いが移植性が高い.
  • @nativeは、CまたはC++コード中の実装方法をマークする.

  • 5.タグインタフェース
  • @cloneableおよび@remoteタグインタフェースは、クローン化されてもよいし、または遠隔地のオブジェクトであってもよい.
  • @SerialVersionUIDシーケンス化バージョンを指定し、シーケンス化可能なクラスをマークします.
  •     @cloneable @remote @SerialVersionUID(6157032470129070425L)
        class Employee(var name: String, var salary: Double) extends Serializable {
          var hireDay = new Date
        }

    6.受検異常と変長パラメータ
  • @throwsタグは、異常なオブジェクトを放出する可能性がある.
  • @varargs JavaからScalaの変長パラメータ付きメソッドを呼び出すことができます.
  •     class Processor {
          @varargs def process(args: String*) {
            println(args.mkString("<", "|", ">"))
          }
        }

    7.ジャンプテーブル生成とインライン
  • C++とJavaのswitchは通常ジャンプテーブルにコンパイルされ、より効率的であり、@switchはScalaがmatchをジャンプテーブルにコンパイルするかどうかをチェックする.
  •     (n: @switch) match {
          case 0 => "Zero"
          case 1 => "One"
          case _ => "?"
        }
  • @inlineメソッドをインラインメソッドとしてマークし、@noinlineはコンパイラにインラインしないように伝えます.

  • 8.省略可能な方法
  • @elidableは、生産コードから削除する必要がある方法にマークを付ける.その後にパラメータが接続されます.
     @elidable(800) def dump(props: Map[String, String]) {}
    
  • コンパイルには、次のコマンドが必要です.
    scalac -Xelide-below 800 prog.scala
    
  • の具体的なパラメータ表は以下の通りで、デフォルト値が1000未満の方法は省略されます.

  • 9.基本タイプの特殊化
  • タイプパラメータに@specialized注記を追加すると、コンパイラは自動的に対応するタイプのすべてのメソッドを生成します.自分でリロード関数を書く必要はありません.
  • で使用できるタイプは、Unit、Boolean、Byte、Short、Char、Int、Long、Float、Doubleです.
    def allDifferent[@specialized(Double, Long) T](x: T, y: T, z: T) = x != y && x != z && y != z
    

  • 10.エラーと警告の注釈
  • @deprecated注釈が追加されると、コンパイラが注釈されたメソッドの使用に遭遇すると、メッセージとsinceの2つのパラメータを選択可能にする警告が生成されます.
    @deprecated(message = "Use factorial(n: BigInt) instead")
    def factorial(n: Int): Int = if (n <= 0) 1 else n * factorial(n - 1)
    
  • @implicitNotFound注記ある暗黙的なパラメータが存在しない場合に意味のあるエラープロンプトが生成されます.
  • @unchecked注記は、一致が不完全な場合に警告情報をキャンセルするために使用される.

  • 【続き】