ゲスト 23人 と メンバー0人 がオンラインです

<p>Java メモ</p>
<p> </p>
<h2>■書籍</h2>
<ul>
<li><a href="https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-Joshua-Bloch/dp/4621303252/ref=pd_sbs_14_1/356-5413801-2950037?_encoding=UTF8&amp;pd_rd_i=4621303252&amp;pd_rd_r=4999523c-bf5d-4bc4-90a0-d58d533fb941&amp;pd_rd_w=3qnar&amp;pd_rd_wg=qODC3&amp;pf_rd_p=ad2ea29d-ea11-483c-9db2-6b5875bb9b73&amp;pf_rd_r=8MVNZEN0HZ95NAEC8YZE&amp;psc=1&amp;refRID=8MVNZEN0HZ95NAEC8YZE">Esential Java 第3版</a></li>
</ul>
<h2> </h2>
<h2>■リンク</h2>
<ul>
<li><a href="https://www.jpcert.or.jp/java-rules/introduction-j.html">Javaコーディングスタンダード</a></li>
<li><a href="https://docs.oracle.com/javase/specs/index.html">JAVA SE仕様</a></li>
</ul>
<h2> </h2>
<h2>■用語</h2>
<ul>
<li>エンロージングインスタンス<br />内部クラスにとっての外部クラスのインスタンス<br />
<pre class="language-markup"><code>// 外部クラス
class OuterClass
{
    // 内部クラス
    class InnerClass
    {
    }
}​</code></pre>
</li>
</ul>
<p> </p>
<h2>■ジェネリクス</h2>
<p> </p>
<h3>用語</h3>
<ul>
<li>具象化不可能型<br />
<ul>
<li>コンパイル時と実行時の型が異なる型 - 関連:イレイザ<br />※Javaではジェネリクスの型が削除される<br />※⇡により、Javaでは実行時にそれがジェネリクスであるかどうか判断できない<br /> ⇢ 主にObject型+型キャストで頑張っている</li>
</ul>
</li>
<li>非境界ワイルドカード<br />List&lt;?&gt;</li>
<li>境界ワイルドカード<br />List&lt;? extends SomeClass&gt;<br />List&lt;? superSomeClass&gt;</li>
<li>型パラメータ<br />List&lt;E&gt;と記述した場合の「E」</li>
<li>原型<br />List&lt;String&gt;の場合は「List」が原型</li>
<li>パラメータ化された型<br />List&lt;String&gt;</li>
<li>PECS(Producer extends Consumer Super) -<strong> 関連:コレクション</strong><br />Producerの場合は&lt;? extends SomeClass&gt;を使用し、<br />Consumerの場合は&lt;? super SomeClass&gt;を使用する
<ul>
<li>Producer:生産者?(値の取得)</li>
<li>Consumer:消費者?(値の設定)</li>
<li>※何故、値の取得がProducerで値の設定がConsumerなのかがよくわからない<br /> GEPS (Get extends Put super)では正確性にかけるのだろうか</li>
</ul>
</li>
</ul>
<p>  </p>
<h2>■StreamAPI</h2>
<ul>
<li><a href="https://backpaper0.github.io/2014/10/04/stream_collect.html">https://backpaper0.github.io/2014/10/04/stream_collect.html</a></li>
</ul>
<p> </p>
<h2>■シリアライズ</h2>
<ul>
<li>transient修飾子<br />対象のフィールドをシリアライズ対象外にする<br />
<pre class="language-markup"><code>private trasient int someData;​</code></pre>
</li>
</ul>
<p id="%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA" class="code-line code-line" data-line="0"> </p>
<ul>
<li id="%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99" class="code-line code-line" data-line="2">シリアライズに関する参考資料
<ul>
<li class="code-line code-line" data-line="4"><a title="https://www.jpcert.or.jp/java-rules/ser01-j.html" href="https://www.jpcert.or.jp/java-rules/ser01-j.html">https://www.jpcert.or.jp/java-rules/ser01-j.html</a></li>
<li class="code-line code-line" data-line="5"><a title="https://docs.oracle.com/javase/jp/1.3/guide/serialization/spec/serialTOC.doc.html" href="https://docs.oracle.com/javase/jp/1.3/guide/serialization/spec/serialTOC.doc.html">https://docs.oracle.com/javase/jp/1.3/guide/serialization/spec/serialTOC.doc.html</a></li>
</ul>
</li>
</ul>
<p> </p>
<ul>
<li id="javaioserializable%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9" class="code-line code-line" data-line="7">java.io.Serializableインターフェース
<ul>
<li class="code-line code-line" data-line="9">Serializableインターフェースはメソッドを持たない。</li>
<li class="code-line code-line" data-line="10">シリアライズが可能であることを示すためのただのマーカとして使われる</li>
</ul>
</li>
</ul>
<p> </p>
<ul>
<li id="javaioobjectoutputstream" class="code-line code-line" data-line="20">java.io.ObjectOutputStream
<ul>
<li class="code-line code-line" data-line="22">基本型とシリアライズが可能なオブジェクトをOutputStreamに出力する</li>
<li class="code-line code-line" data-line="23">OutputStreamとしてFileOutputStreamを指定した場合はファイルに出力できる</li>
<li class="code-line code-line" data-line="23">
<pre class="language-markup"><code>  SomeSerializableClass obj = ...
  ObjectOutputStream stream = new ObjectOutputStream(
      new FileOutputStream("data.tmp")
  );
  stream.writeInt(100);     // 基本型
  stream.writeObject(obj);  // シリアライズ可能なオブジェクト</code></pre>
</li>
</ul>
</li>
</ul>
<p> </p>
<ul>
<li id="javaioobjectinputstream" class="code-line code-line" data-line="33">java.io.ObjectInputStream
<ul>
<li class="code-line code-line" data-line="35">ObjectOutputStreamによりシリアライズされたデータを復元する</li>
<li class="code-line code-line" data-line="35">
<pre class="language-markup"><code>  ObjectInputStream stream = new ObjectInputStream(
      new FileInputStream("data.tmp");
  );
  int intValue = (int)stream.readInt();
  SomeSerializableClass obj = (SomeSerializableClass)stream.readObject();</code></pre>
</li>
</ul>
</li>
</ul>
<p> </p>
<ul>
<li id="%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA%E3%83%87%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA%E6%99%82%E3%81%AB%E7%89%B9%E5%88%A5%E3%81%AA%E6%93%8D%E4%BD%9C%E3%82%92%E8%A1%8C%E3%81%86%EF%BC%91" class="code-line code-line" data-line="44">シリアライズ/デシリアライズ時に特別な操作を行う1<br />シリアライズクラスに次のメソッドを実装することで特別な操作を記述できる。<br />※Serializableインターフェースのメソッドではない 
<ul>
<li class="code-line code-line" data-line="44">
<pre class="language-markup"><code>・ObjectOutputStream
    void writeObject(ObjectOutputStream)
        ObjectOutputStreamにオブジェクトの状態を出力する
    Object writeReplace()
        オブジェクトが書き込まれる前に、オブジェクトのクラスがストリーム内で自らの置換を指定できる
        シリアライズされている自らのインスタンスの型およびインスタンスを直接制御できる
    ObjectOutputStream内ならの呼び出し順
        writeReplace-&gt;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)-&gt;readResolve</code></pre>
</li>
</ul>
</li>
</ul>
<h2> </h2>
<h2>■その他 </h2>
<ul>
<li>リスコフの置換原則 - 関連:契約プログラミング<br />基底型と派生型との間で成立していないといけない規則。<br />基底型のオブジェクトを利用している箇所を、その派生型のオブジェクトで置換可能でなければならない
<ul>
<li><a href="https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87">https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87</a><br /><br /><br /></li>
</ul>
</li>
</ul>
<p>  </p>