Java メモ

 

■書籍

 

■リンク

 

■用語

  • エンロージングインスタンス
    内部クラスにとっての外部クラスのインスタンス
    // 外部クラス
    class OuterClass
    {
        // 内部クラス
        class InnerClass
        {
        }
    }​

 

■ジェネリクス

 

用語

  • 具象化不可能型
    • コンパイル時と実行時の型が異なる型 - 関連:イレイザ
      ※Javaではジェネリクスの型が削除される
      ※⇡により、Javaでは実行時にそれがジェネリクスであるかどうか判断できない
       ⇢ 主にObject型+型キャストで頑張っている
  • 非境界ワイルドカード
    List<?>
  • 境界ワイルドカード
    List<? extends SomeClass>
    List<? superSomeClass>
  • 型パラメータ
    List<E>と記述した場合の「E」
  • 原型
    List<String>の場合は「List」が原型
  • パラメータ化された型
    List<String>
  • PECS(Producer extends Consumer Super) - 関連:コレクション
    Producerの場合は<? extends SomeClass>を使用し、
    Consumerの場合は<? super SomeClass>を使用する
    • Producer:生産者?(値の取得)
    • Consumer:消費者?(値の設定)
    • ※何故、値の取得がProducerで値の設定がConsumerなのかがよくわからない
       GEPS (Get extends Put super)では正確性にかけるのだろうか

  

■StreamAPI

 

■シリアライズ

  • transient修飾子
    対象のフィールドをシリアライズ対象外にする
    private trasient int someData;​

 

 

  • java.io.Serializableインターフェース
    • Serializableインターフェースはメソッドを持たない。
    • シリアライズが可能であることを示すためのただのマーカとして使われる

 

  • java.io.ObjectOutputStream
    • 基本型とシリアライズが可能なオブジェクトをOutputStreamに出力する
    • OutputStreamとしてFileOutputStreamを指定した場合はファイルに出力できる
    •   SomeSerializableClass obj = ...
        ObjectOutputStream stream = new ObjectOutputStream(
            new FileOutputStream("data.tmp")
        );
        stream.writeInt(100);     // 基本型
        stream.writeObject(obj);  // シリアライズ可能なオブジェクト

 

  • java.io.ObjectInputStream
    • ObjectOutputStreamによりシリアライズされたデータを復元する
    •   ObjectInputStream stream = new ObjectInputStream(
            new FileInputStream("data.tmp");
        );
        int intValue = (int)stream.readInt();
        SomeSerializableClass obj = (SomeSerializableClass)stream.readObject();

 

  • シリアライズ/デシリアライズ時に特別な操作を行う1
    シリアライズクラスに次のメソッドを実装することで特別な操作を記述できる。
    ※Serializableインターフェースのメソッドではない 
    • ・ObjectOutputStream
          void writeObject(ObjectOutputStream)
              ObjectOutputStreamにオブジェクトの状態を出力する
          Object writeReplace()
              オブジェクトが書き込まれる前に、オブジェクトのクラスがストリーム内で自らの置換を指定できる
              シリアライズされている自らのインスタンスの型およびインスタンスを直接制御できる
          ObjectOutputStream内ならの呼び出し順
              writeReplace->writeObject
      
      ・ObjectInputStream
          void readObject(ObjectInputStream)
              ObjectInputStreamから値を取得したオブジェクトの状態を復元する
          Object readResolve()
              ストリームから読み込んでいるオブジェクトを置換または解釈処理できる。
              クラス自体の復元されたインスタンスの型およびインスタンスを直接制御できます。
              ObjectInputStream がストリームからオブジェクトを読み込み、呼び出し側に返す準備をしてるときに呼び出される。
          void readObjectNoData()
              オブジェクトの状態を初期化する
              初期化されると成り立たない不変式がある場合は「InvalidObjectException」をthrowする
              バージョンの異なるサブクラスのオブジェクトを復元しようとしたときに呼び出される?
              ※https://docs.oracle.com/javase/jp/7/platform/serialization/spec/input.html#6053
          ObjectInputStream内ならの呼び出し順
              readObject(or readObjectNoData)->readResolve

 

■その他