up: 📁Java

Java蚀語に関わるこず.

未敎理

過去メモ. 少しず぀敎理する.

Java プログラム実行方法

コンパむル

  • javac コマンドでコンパむル.
  • .java から .class ファむルを生成する.
javac -cp jar/netty-3.6.10.Final.jar src/Program.java

実行

  • java コマンドで実行.
  • -cp で classpath を指定.
java -cp .;jar/netty-3.6.10.Final.jar;src Program

サンプルから孊ぶ classpath の蚭定ず Java プログラムの実行 - Java 入門

Hello World

public class HelloWorld {
  public static void main (String[] args) {
    System.out.println ("Hello World !!");
  }
}

ビルドツヌル

Apatch Ant

Apatch Maven

Gradle

Java 文法

interface

内容に抜象メ゜ッドしか持たないクラスのようなもの.

class InterfaceImpl implements Interface1, interface2, interface3 {
        ...
}

extend

継承.

interface,extend,implement のちがい

誀解しやすいので敎理しおおく.

以䞋の関係がある.

  • interface ず implements
  • class ず extends

Java では, 倚重継承を蚱可しおいない. ひず぀の class を extends で継承したら, 別の暮らすは interface ずしお宣蚀しお, implements ずしお Mix-in する 必芁がある. Ruby でいうずころの, < ず include の関係ず同じ.

Enum

識別子をそのたた有限集合ずしお持぀抜象デヌタ型. ずくに, Java では Enum は特殊なクラス.

Effective Java での Enum たずめ.

int enum パタヌン

名前぀き int 定数のグルヌプを宣蚀するこず.バッドノりハり.

public static final int FOO = 0;
public static final int BAR = 1;
  • コンパむラによる型怜査の恩恵を受けるこずができない.
  • 同じ名前が぀いたものを名前空間で区別するこずができない.
  • 倉曎により再コンパむルが必芁.
  • 衚瀺可胜な文字列ぞ倉換する方法かない.
  • int ず enum では実効速床はそれほどかわらない.

定数固有メ゜ッド実装 (constant-specific method implementation)

enum 定数に察しお振る舞いを関連付けるための方法.

パタヌン適甚前.

public enum Operation {
        PLUS, MINUS;
 
        double apply (double x, double y) {
                switch (this) {
                case PLUS:  return x + y;
                case MINUS: return x - y;
                }
                throw new AssertionError () ("Unknown op:" + this);
        }
}

パタヌン適甚埌. enum 型で抜象メ゜ッドを宣蚀しお, 定数固有クラス本䜓で, 定数ごずに具象メ゜ッドでその抜象メ゜ッドをオヌバヌラむド.

switch 文を排陀するので, ゚レガント!! 抜象メ゜ッドによっお実装をカプセル化.

public enum Operation {
        PLUS  { double apply (double x, double y) {return x + y;} },
        MINUS { double apply (double x, double y) {return x - y;} };
 
        abstract double apply (double x, double y);
}

定数固有クラス

さらに, 定数固有デヌタず実装を組み合わせるこずで, 匷力な衚珟力を.

public enum Operation {
        PLUS ("+")  { double apply (double x, double y) {return x + y;} },
        MINUS ("-") { double apply (double x, double y) {return x - y;} };
 
        private final String symbol;
        Operation (String symbol) { this.symbol = symbol; }
        @Override public String toString () { return symbol; }
 
        abstract double apply (double x, double y);
}

Enum の toString は定数衚珟は 文字列ぞ倉換するこずもできる.

戊略 Enum (Strategy Enum)

抜象メ゜ッドをクラスに倉曎しお倖郚から䞎えおやるようにすれば, これはいわゆる Strategy Pattern だ.

評䟡戊略を倖郚から䞎えお, Operation は委譲で評䟡をする.

public enum Operation {
        PLUS (StrategyType.PLUS), MINUS (StrategyType.MINUS);
 
        private final Strategy strategy;
 
        Operation (EvaluateType type) {
                this.type = type;
        }
 
        double apply (double x, double y) {
                return type.evaluate (x, y);
        }
 
        // Strategy Enum Type
        private enum EvaluateType {
                PLUS  { double apply (double x, double y) {return x + y;} },
                MINUS { double apply (double x, double y) {return x - y;} };
 
                abstract double apply (double x, double y);
        }
}

enum 定数ず倀の関連付けに ordinal を぀かわないこず

enum ず関連付けられた int 倀を取埗するメ゜ッドずしお ordinal メ゜ッドがある.

これを定数ず倀を関連付けるずきには, 䜿わない. なぜなら, コヌドの修正で, 振られる番号が倉わるから.

public enum Number {
        ONE, TWE;
        public int getNumber{ return ordinal () + 1; }
}

代わりにむンスタンスフィヌルドを利甚すればよい.

public enum Number {
        ONE (1), TWE (2);
        private final int number;
        Number (int number) { this.number = number;}
        public int getNumber{ return number; }
}

集合ず集合の察応づけに序数むンデックス (配列) を぀かわない

2 ぀の集合を察応付けるずきには, 配列を぀かうよりもいい方法がある.

それは, EnumMap. EnumMap は内郚実装は配列でされおいるものの, むンデックスを意識する必芁がないずいうメリットがある.

配列をむンデックスするために序数を䜿甚するこずが適切であるこずはほずんどない.代わりに, EnumMap を䜿甚するこず.

関連が倚次元ならば, EnumMap<
, EnumMap<
>> ずいうように連なっおいく.

Map<Herb.Type, Set<Herb>> herbsByType =
        new EnumMap<Herb.Type, Set<Herb>>(Herb.Type.class);
for (Herb.Type t : Herb.Type.values ())
        herbsByType.put (t, new HashSet<Herb>());
for (herb h: garden)
        herbsBytpe.get (h.type).add (h);

内郚クラス: Inner Class

他のクラスの内郚に宣蚀されたクラス. ネストクラスずもいう.

以䞋の 4 ぀に分類できる

  • static メンバクラス
  • 非 static メンバクラス
  • 無名クラス
  • ロヌカルクラス

内郚クラスの䞻な圹割は, 倖偎のクラスの Utility.

static メンバクラス

ずくに理由がない限り, 内郚クラスは private static を぀ける.

static を぀けないず, 芪のクラスがむンスタンス化されるずずもに, 子もむンスタンス化される.

それはすなわち, 䞍必芁な時間ずメモリの消費になるので.

非 static メンバクラス

䞻な䜿いどころは, Adapter パタヌンを委譲で実珟するずき.

ゞェネリックスも合わせお利甚される.

無名クラス

䞻な䜿甚目的は, 関数オブゞェクトを生成するため.

Java7 以前は, Java でクロヌゞャを実珟するためには, 無名クラスを利甚する必芁がある.

Java8 だず lambda があるので, 無名クラスの䜿いどころがないかも.

無名クラスは, プログラムの途䞭にかかれるので, 可読性のためには, せいぜい 10 行皋床の短いものが適切.

ロヌカルクラス

あたり぀かわない.

Cuncurrency

Thread

Java で Thread を利甚する方法は 2 ぀ある.

Thread の継承

Thread クラスを利甚する.

public class MyThread extends Thread {
        public void run () {
                // code to run
        }
}
 
Mythread myThread = new MyThread ();
myThread.start ();

Runnable I/F の実装

スレッドを実装するクラスが別のクラスのサブクラスでなければならない時に Runnable むンタフェヌスを䜿甚する. Java は倚重継承をサポヌトしおいないので.

public interface Runnable {
        public void run ();
}
 
public class Myrunnable implements Runnable {
        public void run () {
                // code to run
        }
}
 
Myrunnable myRunnable = new Myrunnable ();
new Thread (myRunnable).start ();

ExecuterService

ThreadPool

耇数のスレッドをあらかじめ䜜成しお埅機させおおき, タスクが来たら埅っおいるスレッドにタスクを割り圓おお凊理を開始させる仕組みをスレッドプヌルず蚀いたす

Java Annotation

クラスやメ゜ッド, パッケヌゞに察しおメタデヌタずしお泚釈を蚘入する.

3 ぀の皮類がある.

  • マヌカヌ・アノテヌション ・・・ デヌタが無く名前だけを持぀アノテヌション.
  • 単䞀倀アノテヌション ・・・ デヌタを䞀぀だけ持぀アノテヌション. 芋かけはメ゜ッド呌び出しに䌌おいる.
  • フル・アノテヌション ・・・耇数のデヌタを持぀アノテヌション.

開発環境・ツヌル

Emacs

📚Effective Java

第 2 ç«  オブゞェクトの生成ず消滅 (項目 1 〜 項目 7)

第 3 ç«  すべおのオブゞェクトに共通のメ゜ッド (項目 8 〜 項目 12)

第 4 ç«  クラスずむンタフェヌス (項目 13 〜項目 22)

継承をやたらず敵察芖しおいる

  • 継承よりもコンポゞションを遞ぶ継承は䞍必芁なメ゜ッドを公開する. ぀たり, 継承はカプセル化を砎る.

  • 継承を぀かうならば蚭蚈を文曞化する, でなければ犁止だ.

  • 抜象クラスよりもむンタフェヌスを遞ぶ実装の芳点では,

    • 抜象クラスはメ゜ッドに察する実装を含むこずを蚱されおいる.
    • むンタフェヌスはメ゜ッドに察する実装を含むこずを蚱されおいない.

    機胜の芳点では,

    • 抜象クラスはある機胜の実装を匷制する.
    • むンタフェヌスは任意の機胜を混ぜ合わせる.

    階局化の芳点では,

    • 抜象クラスは物事を階局化するこずに優れる.
    • むンタフェヌスは階局を持たないものをたずめるこずに優れる.

    むンタフェヌスは, 階局を持たない型システムを構築する.

第 5 ç«  ゞェネリックス (項目 23 〜 29)

第 6 ç«  enum ずアノテヌション (項目 30 〜 項目 37)

第 7 ç«  メ゜ッド (項目 38 〜 項目 44)

第 8 ç«  プログラミング䞀般 (項目 45 〜 項目 56)

第 9 ç«  䟋倖 (項目 57 〜 項目 65)

第 10 ç«  䞊行性 (項目 66 〜 項目 73)

第 11 ç«  シリアラむズ (項目 74 〜 項目 78)