JavaDoc 読解~java.util.Observableクラスの使い方~

java.util.Observableクラス

このクラスは、Observerインターフェースと併用するようにできています。デザインパターンの「Observerパターン」です。

処理の概要

Observableクラスに登録されたObserverクラス(Observerインターフェースをimplementsしたクラス)のupdateメソッドを
変更の通知があったときに呼び出す。

実装してみた

Observableクラスにメインメソッドを実装しました。はじめはObserverクラスに何かしらの変更があったときにupdate処理が走るのかと思ったのですが
次のメソッドが動いたときに走るようです。

Observable#setChanged()とObservable#notifyObservers()を呼び出すとObserverクラスのupdateが起動します。

Observableを継承して作る

import java.util.Observable;
import java.util.function.Function;

public class ObserverSample extends Observable {
    /** 引数String, 返却値Stringのメソッド */
    private Function<String, String> func;

    public ObserverSample(Function fun) {
        this.func = fun;
    }

    public void execute(String str) {
        System.out.println(func.apply(str));
    }

    public static void main(String[] ags) {
        // Functionに意味はないです。実装したときの残骸です。。。
        ObserverSample sample = new ObserverSample(str -> {
            return "aaa: " + str;
        });

        ChildOverver ovs = new ChildOverver("aaa");
        ChildOverver ovs1 = new ChildOverver("bbb");
        ChildOverver ovs2 = new ChildOverver("ccc");
        sample.addObserver(ovs);
        sample.addObserver(ovs1);
        sample.addObserver(ovs2);

        sample.setChanged();
        sample.notifyObservers();
        System.out.println("^^^^^^^^^^^^^^^^^^^^");
        sample.setChanged();
        sample.notifyObservers("pppppp");
    }
}

Observerクラス

import java.util.Observable;
import java.util.Observer;

public class ChildOverver implements Observer {
    private String str;
    public ChildOverver(String str) {
        this.str = str;
    }
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Param is " + str);
        System.out.println("Count: " + o.countObservers());
        System.out.println("arg: " + arg);
    }

    public void setStr(String newStr) {
        this.str = newStr;
    }
}

プログラムの実行結果

Param is ccc
Count: 3
arg: null
Param is bbb
Count: 3
arg: null
Param is aaa
Count: 3
arg: null
^^^^^^^^^^^^^^^^^^^^
Param is ccc
Count: 3
arg: pppppp
Param is bbb
Count: 3
arg: pppppp
Param is aaa
Count: 3
arg: pppppp

Java Doc 読解〜System.out〜

イントロダクション

標準入力に関してやったので、今度は標準出力に関してやります。

上記のキャプチャ「out」が標準出力になります。
でもこれは。。。

標準出力

一番初めのプログラムでこのクラスを使用しています。
コンソール出力がこの「標準出力」にあたります。

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

以上です。

でわでわ。。。


Java Doc読解 〜System.In〜

イントロダクション

標準入力、画面からの入力にはWebのフォームが一番身近に感じる人が多いのではないでしょうか?フォームの出てくる、もっと昔からコンソール入力があるんです。その入力のことを「標準入力」と呼びます。

そして、Systemクラスのフィールドにいます。(実態はInputStreamクラスです)
JavaDocAPIはこちら

標準入力の実装

四の五の言わずにサンプルコードを下に示します。

System.out.println("test1 入力開始");
// 配列は動的に扱うときに大変だ。。。
byte[] moji = new byte[5];
try {
   System.in.read(moji);
} catch(Exception e) {
   e.printStackTrace();
}
System.out.println("入力じた文字:" + new String(moji));

byte配列を用意(宣言した時にメモリの領域が確保されます)、サンプルコードでは5バイト分を用意しています。標準入力を受けて入力した文字を表示します。

シンプルですね(笑)
メインメソッドからちゃんと作成したものはGitにアップしております。

こんな感じです。
でわでわ。。。

Java Doc 読解〜BufferedWriter〜

イントロダクション

BufferedWiterはReaderインターフェースとセットにして使用することが多いです。ちなみにBufferedReaderに関してはこちらです。

BufferedWriter

キャプチャを撮ってみました。ぶっちゃけた話細かいことより「どうつかうの?」が知りたいと思っているところに詳細なクラス関係などを説明されても困るので、筆者は困ったので、早速使い方を以下に示します。

// TODO-[IOExceptionのthrows文、try〜chatchなどを使用します。
FileReader fileRead = new FileReader(new File("./test.txt"));
BufferedReader read = new BufferedReader(fileReader);
BufferedWriter writer = new BufferedWriter(
                           new FileWriter(new File("./out.txt)));
// 読み込む行
String line = null;
while((line = read.readLine()) != null) {
   witer.write(line);
}
// ファイルを閉じる
writer.close();

Readerクラスの記載にも同じコードがあります。
FileReaderでも、通常の文字列でも良いのでwriteメソッドでファイルに出力します。そして、出力が終わったらcloase()してください。ファイルが閉じていない状態だと、対象のファイルが読めなかったり、余計なデーモン閣下が残ったりとして面倒臭いです。
※デーモン閣下→デーモン(デーモン・プロセス)画面上に表示されないけれど画面の裏側にいきているプロセスのことを言います。サーバなど起動しているときサーバーは画面上に出て来ず、裏側で起動している場合があります。この様なプロセスのことをデーモン(デーモン・プロセス)と呼びます。

Readerと合わせて使用することが多いです。他にも標準入力から使用することもあります。※ゲームを作成しようとしたら標準入力は必須になります。

サンプルコード

独自に作成したKozaManagerクラスです。これは、口座情報をファイルに書き出すという処理を実装しています。

/**
 * Copyright (c) 2019-present Coder Bank All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
 * Neither the name Coder Bank nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
 */
package jp.zenryoku.apps.atm.manage;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import jp.zenryoku.apps.atm.data.Data;

/**
 * 口座の管理(登録、更新、削除)を行うクラス
 * @author takunoji
 *
 * 2019/09/21
 */
public class KozaManager {
    /** ファイルへの書き出しクラス */
    private BufferedWriter write;
    /** ファイルの読み込みクラス */
    private BufferedReader read;
    /** 取得(作成)するファイルクラス */
    private File file;
    /** ファイルのパス */
    private static final String FILE_PATH = "resources/koza.csv";

    /** コンストラクタ */
    public KozaManager() {
        // 操作するファイルを指定する
        file = new File(FILE_PATH);
        try {
            write = new BufferedWriter(new FileWriter(file, true));
            if (file.exists()) {
                read = new BufferedReader(new FileReader(file));
            }
        } catch (IOException ie) {
            ie.printStackTrace();
            System.out.println("ファイルオープンに失敗しました。" + ie.getMessage());
            System.exit(-1);
        }
    }

    /** デストラクタ */
    @Override
    protected void finalize() throws Throwable {
        // フィールド変数の後始末
        file = null;
        read.close();
        write = null;
        read = null;
    }

    /** 作成するファイルが存在するかチェック */
    public boolean isFile() {
        return file.exists();
    }

    /**
     * 出力するCSVのヘッダー部分を作成する。
     * @return CSVヘッダーの文字列(カンマ区切り)
     */
    private String createCSVHeader() {
        return "名前, パスワード";
    }

    /**
     * データクラスを受け取り、CSVファイルを出力する(書き出しを行う)
     * @param data コーダー銀行のユーザー情報
     */
    public void dataOutput(Data data) throws IOException {
        if (file.canWrite() == false) {
            throw new IOException("ファイルの書き込みができません: " + file.getAbsolutePath());
        }
        // おおよそのデータサイズを指定すると余計なメモリを使用しなくて済む
        StringBuilder build = new StringBuilder(50);
        // ファイルそ新規で作成するとき
        if (file.exists() == false) {
            // ヘッダー部分の出力
            build.append(this.createCSVHeader());
            // ファイル書き込み処理
            write.write(build.toString());
            write.newLine();
        }
        // StringBuilderのクリア
        build.setLength(0);
        // データ部分の書き込み
        build.append(data.getName() + ",");
        build.append(data.getPassword());
        write.write(build.toString());
        write.newLine();
        write.close();
    }

    /**
     * ファイルを読み込みデータをリストにして返却する
     * @return List<Data> CSVファイルのデータリスト
     */
    public List<Data> readFile() {
        List<Data> list = new ArrayList<>();
        String line = null;
        try {
            while((line = read.readLine()) != null) {
                String[] lineData = line.split(",");
                // lineData[0]: 名前, lineData[1]: パスワード
                list.add(new Data(lineData[0], lineData[1]));
            }
        } catch(IOException ie) {
            ie.printStackTrace();
            System.exit(-1);
        }
        return list;
    }

    /**
     * フィールドのfileを返却する。
     * @return file
     */
    public File getFile() {
        return this.file;
    }
}

でわでわ。。。

Java Doc読解 BufferedReader

イントロダクション

Java Docの内容を読んで、理解します。今回はBufferedReaderを理解します。
以下のリンク先がJavaDocになります。
JavaDoc~BufferedReader~

BufferedReaderはファイル読み個処理の時によく使用するクラスです。

下のコードは、サンプルコードです。

  1. responseは取得したデータ(文字列)を返却するための変数
  2. Files.newBufferedReader()で、このPCの使用する文字エンコードでクラスの生成(インスタンス化)
  3. whileの条件としてreadLine()で取得した文字列(line)がnullでないならば繰り返す
  4. SEPは改行コード
StringBuilder response = new StringBuilder();
final String SEP = System.getProperty("line.separator");
try {
    BufferedReader read =  Files.newBufferedReader(Paths.get("resources/title.txt"), Charset.forName(System.getProperty("file.encoding")));
    String line = "";
    while((line = read.readLine()) != null) {
        response.append(line);
        response.append(SEP);
    }
} catch(IOException e) {
    e.printStackTrace();
}

サンプル動画

読み込み

これは、自分のやり方ですが…

初めに「すべての実装されたインターフェース」を見ます。知っているものがあれば、理解は早いです。メソッドの使い方は全く同じになるので…

次は、クラスの説明部分を読みます。ここまで、上から順に読んでいます。

コンストラクタや、メソッドに関してはナナメ読みして使えそうなものをチョイスします。

Java Docのポイント

結局のところは、使えれば良い(処理の中身は必要に応じて)ので用途を理解できるようになれば、おっけ

Java Docの理解には、以下の事を分かっておくと楽です。

  1. 継承関係について
  2. 対象クラスのベースになるフレームワークの理解、これはリストやマップであれば、コレクションフレームワークになるし、JavaFXであればJavaFXのフレームワークになります。

BufferedReader

BufferedReaderの使用サンプルを下に示します。※上記のサンプルとは別の書き方です。処理内容はほぼ同じ

// リーダー作成
Reader reader = new InputStreamReader(System.in);
// コンストラクタ
BufferedReader buf = new Bufferedreader(reader);

こんな感じです。ちなみにファイルの読み込みを行うときは

// TODO-[IOExceptionのthrows文、try〜chatchなどを使用します。
FileReader fileRead = new FileReader(new File("./test.txt"));
BufferedReader read = new BufferedReader(fileReader);
BufferedWriter writer = new BufferedWriter(
                           new FileWriter(new File("./out.txt)));
// 読み込む行
String line = null;
while((line = read.readLine()) != null) {
   witer.write(line);
}
// ファイルを閉じる
writer.close();

Readerクラスを継承したクラスがJava Docに記載されているのでどれを選んでもおっけーです。ちなみにBufferedWriterに関しても記載しております。

既知のサブクラスに記載されてます。

関連するインターフェースなど

そして、対象のクラスの継承関係(親子関係)

早い話が、Readerクラスを親に持っていますよ。ということ

BufferedReaderと似たクラスは何かな?と思ったら親クラスのReaderクラスを参照してみれば良い。

以下のようなクラスが兄弟クラスとして見ることができます。
BufferedReader,
・ CharArrayReader,
FilterReader,
InputStreamReader,
PipedReader,
StringReader

こんな感じで開拓して行くのも面白いのではないでしょうか?

でわでわ。。。

Java Doc Classloader

ClassloaderのJavaDoc読解を行います。

昔(かれこれ5年くらい前)読んだ時より内容が変わっています。。。
NetWorkClassloaderについて記載があります。

まとめるとClassloaderはクラスをロードするクラスで
そのためのメソッド群が用意されています。

抽象クラスなので、new Classloader()の様には使えません。
JavaDocで「修飾子と型」の列にprotectedと記載している
メソッドも使用できません。
※このクラスを拡張するときに使用できます。

/** クラスを拡張する */
public ExpandClassloader extends Classloader {
    // 何かの処理
}

拡張しないで使用するのは、以下のメソッドくらいかな?
getResourceAsStream(String name)
getSystemResource(String name)
loadClass(String name)

サンプルコードはこちらです。

Classloader

まとめると、クラスローダーは、クラスパスとビルドパスからクラスなどを検索してくれます。
よく使用するのが、getResourceAsStream()です。
クラスパス、ビルドパスからリソース(.txt, .png)などを検索できます。
これはOpenCVの実行ですが、参照しているイメージファイルはgetResouceXXXXを使用しています。


関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

JavaDoc 読解 〜 Filesクラス 〜

昔は、FileReader, FileInputStreamを使用してやっていました。
今でも使用できますが、java.nio.files.Filesを使用する方法が
スタンダードになってきたかな?という感じです。

記述する内容は、昔よりも格段に減りました。

// FILEのパス
Path filePath = Paths.get(FILE_PATH);
List<String> lines = Files.readAllLines(filePath);

こんな感じで処理が実現します。
ちょっと省略してますが。。。

まぁ細かいところはこちらのソースをご覧ください。
ダウンロードして実行できるはずです。
※Macで作成しているためビルドパストか違っています。
ソースのみを取得して実行することをオススメします。
MacでEclipseを使用している人はプロジェクトごとPullして
おっけーです。

ちなみに、ファイルの読み込みなどを行うときに
「パスの指定」で結構つまづきます。
ルートになるパスがプロジェクトのディレクトリになるのですが

頭に「/」がついたりつかなかったりと。。。
とりあえず、「パスの使い方サンプル」を実装しました。

System.out.println("*** Paths Testing ***");
Path path = Paths.get("resources", "title.txt");
// 標準出力
path.forEach(System.out::println);
System.out.println("*** read File ***");
try {
   List<String> list = Files.readAllLines(path, Charset.defaultCharset());
   list.forEach(System.out::println);
} catch(IOException e) {
   e.printStackTrace();
}
  1. Paths.get(ファイルへのあるフォルダまでのパス, ファイル名);
    呼び出しはクラス名.メソッド名の様に呼びます(staticメソッドの呼び出し)
    の様に引数に値を設定します。 ファイルは以下にあります
    「project/resource/title.txt」
  2. 取得した「Path(Pathsとは別のクラスです)」からforEachメソッドを使用して
    System.out.printlnメソッドを渡しています。
    これはラムダ式の書き方でループで取得したpathの中身を上記のメソッドに渡す
    という処理になります
  3. ListでのforEach()です。これも上記と同様です。
    ラムダ式の書き方でclazz.xxx(
    コレクション内の要素変数(名前は自由) -> メソッドなどの処理);
    の様に記載します。
    サンプル、パターン1と2は同じ動きをします。

    // Pattern1
    xxxx.forEach(str -> method(str));
    // Pattern2
    xxxx.forEach(Class::method);

     




関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

JavaDoc 読解 Mapインターフェースクラス~使い方も記載~

イントロダクション

プログラミングの主な用途としては、データの処理、文字列をくっつけたり、右の情報と左の情報をくっつけたり、もちろん逆に切り離したり。。。
イメージとしては、レゴブロックのように、くっつけて、ばらしてを繰り返して別な形にするということが往々にしてあります。

それというのは、情報を改ざんさせないためだったり、作成者の考えた仕組みを作る理由で。。。などいろんな理由でデータの操作が必要になります。
そこで標準的に使えるのが、データをそのまま取得するListや配列、他にはキーと値(Value)をセットにして保持するMapがあります。


インタフェースMap<K,V>

Java Docの解釈を行います。
「既知のすべての実装クラス:」と書いてある部分は
javaAPIで提供されているクラスです。
→java.util.Mapをインポートすればおっけ

例:import java.util.Map
実装のサンプルはこちら

Mapの実装クラス(インターフェースでない)は
サンプルコードではHashMapとPropertiesを記載しています。

Mapの使い方

Mapインターフェースクラスは、既存の実装クラスとして、ほかにもあるのですが、よく使うものとしてHashMapがあります。LinkedHashMapもあり、ListのArrayListとLinkedListのような関係です。

putとget

Mapは、基本的に下のような操作を行います。

  • 「put」メソッドで値をセット
  • 「get」メソッドで値を取得します。

Mapの使用例:じゃんけんゲーム

Mapを使用したサンプル。じゃんけんゲームでの各パターンをセットする。
じゃんけんの各手を以下のように定義してそれぞれのキー(パターン)に対応した結果を取得する

  1. じゃんけんの判定はint型
変数名
YOU_WIN 0
YOU_LOOSE 1
AIKO 2
  1. 各手は文字列型
変数名
GU "0"
CHOKI "1"
PA "2"

<プレーヤーの価値ケース>
GU + CHOKI = "01"; => マップのキー

/* 勝敗判定フラグ:勝ち(ユーザー) */
final int YOU_WIN = 0;
/* 勝敗判定フラグ:負け(ユーザー) */
final int YOU_LOOSE = 1;
/* 勝敗判定フラグ:あいこ(ユーザー) */
final int AIKO = 2;
/* グー */
final String GU = "0";
/* チョキ */
final String CHOKI = "1";
/* パー */
final String PA = "2";

// 勝敗判定マップを作成
Map<String, Integer> hanteiMap = new HashMap<String, Integer>();
// プレーヤーの勝ちケース
hanteiMap.put(GU + CHOKI, YOU_WIN);
hanteiMap.put(CHOKI + PA, YOU_WIN);
hanteiMap.put(PA + GU, YOU_WIN);
// プレーヤーの負けケース
hanteiMap.put(GU + PA, YOU_LOOSE);
hanteiMap.put(CHOKI + GU, YOU_LOOSE);
hanteiMap.put(PA + CHOKI, YOU_LOOSE);
// あいこのケース
hanteiMap.put(GU + GU, AIKO);
hanteiMap.put(CHOKI + CHOKI, AIKO);
hanteiMap.put(PA + PA, AIKO);

※PropertiesはMapと違う部分がありますが
概ね一緒です、細かいところはサンプルコードをみてください

Mapの使い方:そのほか

Mapはキーと値をセットにしているので
「contains」メソッドで値の有無をチェックしたり
Listクラスの様に「forEach」でループしたりと色々できます。

マスターデータとのリンク

下のように処理を行うときにMapで処理を行うと簡単にできます。

  1. マスターデータのきーを取得する
  2. マップからキーに対応するデータの有無をチェック
  3. マップにキーがあればデータの取得とリストへの登録
// マスタカテゴリ設定とのリンク
String mstKey = data.getMaster();
if (masterMap.containsKey(mstKey)) {
    RpgMaster mst = masterMap.get(mstKey);
    // パラメータ定義のキーリストに追加
    mst.getChildList().add(data.getKigo());
}

ゲームのマップを作る

これも、Mapインターフェースクラスを使用して作成することができます。
タイルの1つ1つがキーと値の関係になっていて、値にはイメージ(画像)がセットされています。

Mapインターフェースクラスはリストインターフェースクラスと並び使用頻度の高いクラスです。

他にもTreeMapなどがあり、ソート(並び替え)などできます。

並び替えはまた後日・・・

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java Doc 読解 System

イントロダクション

「System.out.println()」で使用するクラス、SystemクラスのJavaDocを読んでみます。
Systemクラスは、staticメソッドばかりが定義されているので、System.XXX()と使用することが多いです。
このクラスのJavaDocを見てみるといろいろと発見があると思うので、これを勧めたいというわけです。

Systemクラス

java.lang.Systemクラス(JDK ver1.8)のJavaDoc 読解です。とはいっても、一部の使えそうなメソッドを読んでその意味を記載したものになります。

<よく使用するコード>

System.out.println("何かしらの文字列");
// Javaを起動しているシステム(OS)の改行コードを取得する
String SEP = System.lineSeparator();

使い方

基本的に「new」しないで使用します。コードでは、System.メソッド名(フィールド名)の様に使用します。
このようなメソッドの呼び出し肩を静的呼び出し(static呼び出し)と筆者は読んでます。一般的でないかもしれません。。。
次のような感じです、System.out.println("XXX");

この処理の内訳を解説すると次のようになります。

Systemクラスの中にある、staticフィールド変数、out(PrintStream型)のメソッドprintln()を呼び出している

フィールド変数が直接呼び出せるのは「public」かつ「sattic」になっているからです。
具体的には下のようなコードです。

public class Sample {
    /** スタティックフィールド変数 */
    public static String publicStr = "Moring!";
    private static String privateStr = "Hello";

    public static void main(String[] args) {
        // エラーなし
        System.out.println(Sample.publicStr);
        // エラーあり、privateは外部から呼び出せない
        System.out.println(Sample.privateStr); 
    }
}

実行サンプルコードはこちらです。

それぞれ
out: 標準出力を表す「PrintStramクラス」 ※InputStreamをラップしたクラスです。
err: 「out」と同様に、「標準」エラー出力
in: 標準入力

例:

初めのプログラム「ハローワールド」では「標準出力」を使用しました。

毎度おなじみ標準出力(コンソール出力)「System.out」

System.out.println("文字列を記述");

Systemクラスのフィールド「out」を呼び出しさらに「println」メソッドを呼びます。これは改行が含まれます。

System.out.print("文字列を記述");

printlnとprintの違いです。ただしprintは、改行が含まれません。

標準入力「in」

使い方の例を示します。

一番レベルが低い状態(他のクラスでラップしない)
byte[] input = new byte[3]; // 3文字の入力を受け付ける(全角は1文字)

System.in.real(input, 0, 2); // 3文字文の領域しか用意していない

【メソッド読解】
このクラスでは全てが「static」メソッドです。
equalsなどは「Object」(親)クラスのメソッドです。

  1. arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    src: コピー元の配列を設定する
    srcPos; コピーを開始する位置を指定
    dest: コピー先の配列
    destPos: コピー先配列の開始位置
    length: コピーする数
  2. 以下は、システム・レベルで扱うプロパティなのでいじらない方が良いかも?
    clearProperty(String key)
    setProperty(String key, String value)
  3. その他、よく使うのものをピックアップしました。
    exit(int status): 起動しているJavaアプリケーションを終了します。
    ※この処理が走ると強制的に終了します。
    gc(): ガベージコレクション(もう使用していないオブジェクト)を解放します。
    ※メモリの解放を行います。細かいことは後々。。。
    そして、下のコードと同じ意味です。

    Runtime.getRuntime().gc()
  4. getenv():環境変数などの値が入っているMapが返されます。

標準入力〜標準出力を行ったプログラム=テキストRPG(戦闘シーンのみ)を作成しましので、画像を見ると、イメージがつきやすいと思います。


関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
  2. オブジェクト指向の概念2〜クラスとは〜

Java Doc 読解 List 〜java.util.List その1〜

イントロダクション

自分の記憶によると、JavaDocを読む人が多いイメージがあります。JavaAPIの使い方が書いてあるのでこれが読めればJavaを極めたといって過言ではないと思うのですが。。。

つまり、JavaDocを進めたかった次第です。。。

JavaDoc

JavaDocとは、作成したメソッド、クラスの説明を行うコメントです。しかし、通常のコメントと違うのは、「javadoc」コマンドを使用してJavaDocが出力できるところです。
自分の作成したものがドキュメントで一覧できれば、ちょっと嬉しいですし、実際には現場での作成してきたコードの説明などをこのJavaDocを使用して行えばずいぶんと学習コストが削減できると思います。

JavaDocを読む

Java Docの読解ということで、左のリンクはJava8のドキュメントで、Java8の概要を記述しているものになります。その中にある「List]について今回は読み進めてみようと思います。

リストはコレクションの仲間

コレクションフレームワーク(CollectionFramework日本語)のスーパーインターフェース(親インターフェース)にあるCollectionは
Collections Frameworkの根っこになるものです。

※スーパーインターフェース(親インターフェース)はコードに書くと下のようになります。

public interface 子供インターフェース extends 親インターフェース

ポイント

・ループ処理が楽になる
・便利なメソッドがあると思ってもらえばおっけ。
・Iteratableは「forEach」メソッドを提供します。→ラムダ式が使えるということ

List<E>のEはエレメント(要素)

を示し、ジェネリクスと呼びます。
リストなどを使用する時は大体これがもれなく付いてきます。

// ArrayListをListとして使用します。
List<String> list = new ArrayList<>();
// LinkedListをListとして使用します。
List<String> list = new LinkedList<>();
// VectorをListとして使用します。
List<String> list = new Vector<>();

上記の様に使用します。

用途としては、リストに登録した値をソート(並び替え)、指定したものの取得、リスト内にあるかチェックするなど

色々とあるので探してみるのも一興です。
百聞は一見にしかずです。ソースはこちらです。
Gitからダウンロードできます。

類似品にセット(Set)があります

toArray()はList→配列(T[])の形へ変換する

サンプルコードです。

ArrayList<TestA> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
   list.add(new TestA());
}
TestA[] items = new TestA[list.size];
items = list.toArray(items);

これで対象の型(クラス)を安全に取り出すことができます。

昔のやり方だとキャストしていましたので、コードとして美しくないし、ClassClastExceptionに対する注意が必要(安全な型変換ではない)なのでイマイチなコードでしたが、最近ではこのような方法があるのでGoodですね。

<イマイチなコード>

ArrayList<TestA> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
 list.add(new TestA());
}
// キャストしているので安全ではない
items = (TestA[]) list.toArray();

リストの主な機能

リストへの要素追加、削除、検査
ラムダ式オブジェクト取得

Collections

リストなどコレクションを扱うのに便利なクラスCollectionがあります。※以下にメソッドの一部を記載します。

  • Collection.addAll(): 指定されたすべての要素を指定されたコレクションに追加します。
  • Collection.disjoint(): 指定された2つのコレクションに共通の要素が存在しない場合、trueを返します。

List Map

Listの扱いに慣れたら、Mapインターフェースクラスも使ってみましょう。実態クラスとしては、HashMapクラス、LinkedHashMapクラスがあります。
そのほかにもありますが、今回はここまでにします。

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜