投稿

[PHP] マジックメソッド - 未定義属性の処理

マジックメソッドとは、クラスに定義されるメソッドで、あらかじめ役割が決められたいくつかのメソッドのことを言います。 以下の記事で取り上げたコンストラクタとデストラクタについても、マジックメソッドの一種です。 https://www.s-watanabe.work/2022/12/php_11.html ここでは、未定義の属性への操作しようとしたときに呼び出されるメソッドについてまとめていきます。 __setメソッドと__getメソッド PHPは基本的に未定義の属性へのアクセスが可能になっています。例えば以下のコードはエラーにならずに実行可能です。 class Test { } $test = new Test(); $test->name = 'Hoge'; echo "name=", $test->name, "\n\n"; var_dump($test); 実行結果は以下のようになります。 $ php test_magic-method.php name=Hoge object(Test)#1 (1) { ["name"]=> string(4) "Hoge" } この属性をセットする時の処理を制御するのが __setメソッド、属性を取得する処理を制御するのが __getメソッドです。 マジックメソッドのシグネチャ __setメソッド 1. __setメソッドのシグネチャ アクセス修飾子 public or なし メソッド名 __set 第一引数 string (属性名) 第二引数 mixed (値) 戻り値 void __getメソッド 2. __getメソッドのシグネチャ アクセス修飾子 public or なし メソッド名 __get 第一引数 string (属性名) 戻り値 mix

[PHP] コンストラクタとデストラクタ

コンストラクタ PHPでクラスを利用する際に、最初にnew演算子によってクラスのインスタンスを作成するという作業を行いますが、この時に実行されるメソッドをコンストラクタと言います。 コンストラクタは省略可能で、省略した場合引数を持たないデフォルトのコンストラクタが内部的に用意されます。 コンストラクタの定義構文 public function __construct(引数) { // プロパティなどの初期化処理 } [実装例]コンストラクタでメンバー変数を初期化する コード class Test{ private int $id; private string $name; public function __construct(int $id, string $name) { echo __METHOD__, "\n"; $this->id = $id; $this->name = $name; } } $test = new Test(1, "Test Name"); var_dump($test); 実行結果 $ php test_construct.php Test::__construct object(Test)#1 (2) { ["id":"Test":private]=> int(1) ["name":"Test":private]=> string(9) "Test Name" } [間違った実装例]引数なしのコンストラクタを呼び出す 引数ありのコンストラクタを定義した状態で、引数なしのコンストラクタを呼び出すとエラーになります。コンストラクタをクラスに明示的に定義した時点で、デフォルトのコンストラクタは無効になります。 コード class Test{ private int $id; private string $name; public function __construct(int $id, string $na

[PHP] 抽象クラスとインターフェース

PHPの抽象クラスとインターフェースについてです。 抽象クラス 抽象クラスは継承される前提のクラスで、それ自体ではインスタンスを生成することが出来ないクラスです。 インスタンスは生成できませんが、メソッドやプロパティは持つことが可能で、これらは基本的に継承されたサブクラスから呼ばれて扱われます。 抽象クラスの最大の特徴は、抽象メソッドを持つことが可能です。抽象メソッドとは、処理を記載しないメソッドで、サブクラスでオーバーライドされて処理が実装されます。 抽象クラスを継承したサブクラスでは、抽象メソッドを必ずオーバーライドしなくてはなりません。 抽象クラスと抽象メソッドの定義構文 abstract class 抽象クラス名 { abstract function 抽象メソッド名(シグネチャ) : 戻り値(任意); } [実装例]抽象メソッドをオーバーライドする コード abstract class TestAbstract { abstract function printName(string $name) : void; } class Test extends TestAbstract { function printName(string $name) : void { print "Hello {$name}.\n"; } } $test = new Test(); $test->printName("abstract"); 実行結果 $ php test_abstract.php Hello abstract. [実装例]抽象クラスからサブクラスに継承されたメソッドを実行する 抽象クラスに定義されたメソッドから、サブクラスに継承されたメソッドを実行することが出来ます。 コード 以下の例ではTestクラスでオーバーライドされたprintNameメソッドを、親クラスであるTestAbstractクラスのtestメソッドから呼び出しています。 抽象クラス事態はインスタンスを持つことはできませんが、サブクラスであるTestクラスのインスタンスがあるため、testメソッド内で$thisキーワードが使用できます。 abst

[PHP] static修飾子について

static修飾子を使った静的変数、静的プロパティ、静的メソッドについてです。 静的変数 関数内で定義された変数のスコープはローカルスコープと言い、呼び出し元のスコープや外部のスコープからは参照できず、関数が終了したら値ごと破棄されます。 しかし、変数を静的変数で定義することで、変数の値を関数終了後も値を維持しておくことが可能です。 定義 static 変数; [実装例] 通常の変数定義 コード 以下のコードは通常の変数定義です。 function counter() { $var = 0; $var++; return $var; } $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; 実行結果 ローカル変数 $var の値は counter関数が終了するたび破棄されるので、何度呼び出しても結果は変わりません。 $ php test_static.php count=1 count=1 count=1 [実装例] 静的変数での変数定義 コード 以下のコードは変数 $var を、静的変数で定義した例です。 function counter() { static $var = 0; $var++; return $var; } $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; $count = counter(); print "count={$count}\n"; 実行結果 $var の値はcounter関数の終了後も保持されているのが分かります。 $ php test_static.php count=1 count=2 count=3 静的プロパティ クラスのプロパティをst

[PHP] コールバック関数について

PHPのコールバック関数とは、呼び出し先関数の中でさらに呼び出される関数のことを言います。コールバック=「後で呼び出される」という意味があります。 ここではコールバック関数の基本的な使い方、無名関数を使った呼び出し、コールバック関数を使ったいくつかの例についてまとめていきます。 コールバック関数 実装例 コールバック関数はcallable型で定義され、呼び出された関数内で実行(コールバック)されます。 以下の例は一番簡単な例です。test_callback関数の引数にコールバックさせたい関数名を指定して、test_callback内でコールバックしています。 コード function test_function() { print __FUNCTION__ . "\n"; } function test_callback(callable $function) { $function(); } test_callback("test_function"); 実行結果 $ php test_callback.php test_function 無名関数で指定する実装例 callable型は以下のように無名関数で指定することも可能です。 コード function test_callback(callable $function) { $function(); } test_callback(function() { print __FUNCTION__ . "\n"; }); 実行結果 無名関数で指定した場合、関数名が無いので __FUNCTION__ は以下のように出力されます。 $ php test_callback.php {closure} array_map関数 配列の全要素に対して処理を行う array_map関数は配列の全要素に対して処理を行うための関数です。従来配列の全要素に対して処理を行う場合、for文やforeach文を使用して記述していましたが、これが簡潔に記述できるようになります。 なお、array_map関数は引数に指定した配列を直接変更するのではなく、処理した結果の配列を返します。

[PHP] 可変関数/可変変数について

可変関数は関数名を変数に設定して、変数に応じて対応する処理を呼び出すことが出来る関数です。 また、関数と同様に、変数に関しても可変にすることが出来ます。 可変関数 構文 $変数() [実装例]通常の関数を可変関数として呼び出す コード function test_variable_function(string $value) { echo $value . "\n"; } $function = "test_variable_function"; $function("call variable function test."); 実行結果 このコードは正しく実行でき、以下のように出力されます。 call variable function test. [実装例]オブジェクトのメソッドを可変関数として呼び出す - 1 クラスオブジェクトのメソッドを可変関数で呼び出す場合は、呼び出すための変数を配列で指定し、第一引数にオブジェクトのインスタンス、第二引数にメソッド名を指定します。 コード class Test { function test_variable_function(string $value) { echo $value . "\n"; } } $function = [new Test(), "test_variable_function"]; $function("call variable function test."); [実装例]オブジェクトのメソッドを可変関数として呼び出す - 2 クラスオブジェクトのメソッドを可変関数で呼び出す場合は、呼び出すための変数を配列で指定し、第一引数にオブジェクトのインスタンス、第二引数にメソッド名を指定します。 コード class Test { function test_variable_function(string $value) { echo $value . "\n"; } } $test = new Test(); $function

[PHP] 無名関数とアロー関数について

無名関数はその名の通り、名前を持たない関数で、クロージャーとも呼ばれます。 無名関数 構文 function(引数) { 処理; } [実装例]無名関数を変数に入れて使う コード $func = function(string $value) { print "Hello {$value}\n"; }; $func("Test"); このコードの正しく実行でき、結果は以下のようになります。 実行結果 $ php test_anonymous_function.php Hello Test [実装例]呼び出し元スコープの変数を使う コード(誤) 無名関数の呼び出し元のスコープに定義されている変数は、無名関数内でそのまま扱うことはできません。例えば以下のコードは実行時にエラーになります。 $name = "Hoge"; $func = function(string $value) { print "Hello {$value} {$name}\n"; }; $func("Test"); 実行結果(誤) $ php test_anonymous_function.php Warning: Undefined variable $name in ./test_anonymous_function.php on line 5 Hello Test コード(正) 呼び出し元スコープの変数を無名関数内で利用するには、function定義時にuseキーワードを使用して無名関数に渡してやります。 $name = "Hoge"; $func = function(string $value) use ($name) { print "Hello {$value} {$name}\n"; }; $func("Test"); 無名関数内で呼び出し元スコープの変数を使うには、useキーワードに使用する変数を指定する 実行結果(正) $ php test_anonymous_function.php Hello Test Ho

[PHP] PHP8のインストール (Win)

イメージ
PHP8のインストールについてまとめます。 インストール PHPの最新のコードは公式サイトで公開されています。また、最新以外のコードもChangelogの確認も含めて取得することが可能です。 パッケージダウンロード 公式サイト( https://www.php.net/ )を開き、上段メニューのDownloadsをクリックします。 ダウンロードページ( https://www.php.net/downloads )を開き、自身の環境に合ったパッケージを選択します。 ここでは、Windows10にセットアップするので「Windows Downloads」をクリックします。 Zipファイルのパッケージをクリックしてダウンロードします。 ファイル指紋の確認(任意) ダウンロードしたZipファイルにはSHA256ファイル指紋が付いています。この値を確認することで、ファイルが改ざんされていないかを確認することが出来ます。 Windowsの場合、certutilコマンドで以下のようにして確認します。 $ certutil -hashfile php-8.1.13-nts-Win32-vs16-x64.zip SHA256 SHA256 ハッシュ (対象 php-8.1.13-nts-Win32-vs16-x64.zip): 766630b4168c830820ace21df301b8816e6675c5ed26395a3d7c5fdef1690dd8 CertUtil: -hashfile コマンドは正常に完了しました。 セットアップ PHPのセットアップはダウンロードしたZipファイルを任意の場所へ展開するだけでOKです。 ここでは「c\php」へ展開しました。 環境変数 展開したディレクトリのパスを環境変数に設定すれば、セットアップは完了です。 Windowsボタンから「設定」を開く 「システム」をクリック 「詳細情報」をクリック 「システムの詳細設定」をクリック 「詳細設定」タブから「環境変数」をクリック 「システムの環境変数」の「Path」を選択し、編集をクリック PHPを展開したディレクトリのパスを追加して「OK」をクリック システムのプロパティで適用しOKをクリック

[資格] Oracle Certified Java Programmer, Bronze, Silver, Goldを取得した話

イメージ
Oracle認定JavaプログラマのBronze、Silver、Goldをすべて取得してきました。 Oracle認定Javaプログラマについて 概要 Oracle認定Javaプログラマは、日本Oracle社が主催するJavaプログラマ向けのベンダー資格です。 Javaのバージョンアップに合わせて試験の内容もバージョンアップされており、2022年12月現在はJava SE 8とJava SE 11が配信されています。今から取得を考えている人は、特に理由がない限りJava SE 11の取得を目指したほうが良いでしょう。 試験のグレードとしてはBronze(初級)、Silver(中級)、Gold(上級)の3段階あります。3段階ですがそれぞれで範囲が違ってくるので、試験に合わせた準備が必要です。 Bronze SE 概要 この試験はいわゆる入門向けの資格で、プログラミング言語(Java)を初めて学ぶ人を対象とした資格です。変数や制御構文の基礎、クラスやオブジェクト指向の基礎について出題されます。 なお以前はJava SE 7/8 Bronzeが配信されていましたが、現在はバージョンに依存しない構成でリニューアルされています。 試験情報 1. Bronze SE試験情報 資格名 Oracle Certified Java Programmer, Bronze SE 試験番号 1Z0-818(-JPN) 問題数 60 試験時間 65分 合格ライン 60% 受験料(税込み) ¥12,540 前提条件 無し、誰でも受験・認定可能 参考書 所感 実はこの試験が一番危なかったです。理由は試験時間に対して問題数がやや多く、1問1分程度で解かなくてはならないためじっくりと考えていると時間が足りなくなります。 問題としてはプログラムのロジックを理解する問題が多いですが、テンポよく解いていく必要があります。とにかくスピード重視です。 参考書に挙げた問題集を使って慣れておくとよいです。 Silver SE 11

[Java] JDBCのAPIでデータ検索・更新

イメージ
JDBCのAPIを使用してDB操作をする方法について、いくつかまとめていきます。 JDBCを介してSQLを発行する場合、Statementインターフェースを使用します。Statementインターフェースには以下の種類があります。 1. Statementの種類 Statement パラメータなしのSQL文を実行する。コンパイルせずに文字列のままSQL文を発行するので、DBMSがSQL文を解析する。 PreparedStatement Statementインターフェースのサブインターフェースで、パラメータ付きのSQL文を実行することが出来る。SQL文はDBMSが理解できるようにあらかじめコンパイルして発行する。 CallableStatement Statementインターフェースのサブインターフェースで、ストアドプロシージャを実行することが出来る。 なお、この記事で使用するテーブルとして、以下のようなデータを用意しています。 テーブル名はarticles、idを主キーにtitle、bodyといったフィールドを保持したテーブルです。 Statementを利用してSQLを実行 Statementインスタンスを取得 Connectionオブジェクトから生成 Statementインターフェースのインスタンスは、ConnectionクラスのcreateStatementメソッドで生成します。 Connection conn = DriverManager.getConnection(url, user, password); Statement statement = conn.createStatement(); Statementインスタンスの主なメソッド Statementインターフェースの主なメソッドは以下の通りです。なお、これらのメソッドはサブインターフェースである、PreparedStatement、CallableStatementにもそれぞれ引き継がれます。 2. Statementインスタンスの主なメソッド ResultSet executeQuery(String) 引数で指定されたデータ検

[Java] JDBCドライバでMySQL接続するまでの手順

イメージ
JavaでJDBCドライバを利用して、データベース接続をするまでの手順です。ここではJDBCドライバのインストール、jarファイルのセットアップまでの手順をまとめます。 なお、今回使用するデータベースはMySQLを使用しますが、1からサーバーを立てるのは大変なので、以前Laravel環境を構築したときに使用したdocker上のMySQLを使用します。これについては以下の記事を参照してください。 https://www.s-watanabe.work/2020/12/laravel-mysqldocker.html 1. 環境情報 OS Windows10 データベース MySQL JDBCドライバ Connector/J 8.0.31 IDE IntelliJ JDBCドライバのセットアップ インストーラのダウンロード 以下のMySQL公式サイトのダウンロードページからConnector/Jという、JDBCドライバをダウンロードします。なお、現在単体でのダウンロードは見つからなく、MySQL Installerに含まれているようなので、MySQL Installerをダウンロードします。 https://dev.mysql.com/downloads/connector/j/ インストーラを実行 ダウンロードしたインストーラを実行し、Setup TypeにCustomを選択してNextをクリックします。 インストールするプロダクトを選択 インストールするプロダクトは最小構成にしたいので、Connector/Jのみを選択します。 ダウンロード対象のプロダクトを確認 Connector/Jが入っていればOKです。Executeをクリックするとダウンロードとインストールが開始されます。 セットアップ完了 Show Detailをクリックすると、セットアップのログが確認できます。ここにライブラリがインストールされたディレクトリが確認できるので控えておきます。 Next → Finishをクリックし、MySQL JDBCドライバのセットアップは完了です。 ライブラリ設定 次にインス

[Java] シリアライズとデシリアライズ

入出力ストリームを利用してインスタンスをファイルに書き出すことをシリアライズ、ファイルから読み込むことをデシリアライズと言います。 Serializableインターフェース Serializableインターフェースはシリアライズ、デシリアライズさせたいクラスに実装させるインターフェースです。 このインターフェースは、マーカーインターフェースといい、シリアライズするクラスであるということをJVMへ示すためだけのものです。メソッドは何も持っていません。 コード例 ここではidとnameというフィールドを保持するPersonクラスを定義し、Serializableインターフェースを実装しています。 import java.io.Serializable; public class Person implements Serializable { private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "id:" + id + ", name:" + name; } } Serializableインターフェースはマーカーインターフェースであり、JVMがシリアライズ可能と判別するためのもの。メソッドは持たない。 シリアライズ ObjectOutputStreamクラス オブジェクトをシリアライズしてファイルに書き出すにはObjectOutputStreamクラスを使用します。 ObjectOutputStreamクラスのインスタンスを取得 ObjectOutputStreamクラスのコンストラクタは、FileOutputStreamクラスのオブジェクトを引数に取ります。 FileOutputStream fstream = new FileOutputStream("output/test.ser"); ObjectOutp

[Java] バイト入出力ストリーム

画像ファイルなどのバイナリーデータの入出力については、バイトストリームを扱うクラスが用意されています。ここでは、バイトストリームの入出力についてまとめていきます。 バイト入出力ストリーム FileInputStreamクラス ファイルからバイトストリームを読み込みます。 1. FileInputStreamクラスの主なメソッド byte read() ファイルから1バイト読み込むで返す。 byte[] readNBytes(int) ファイルから指定バイト数を読み込んで配列を返す。 byte[] readAllBytes() ファイルから全バイトを一度に取り出して配列で返す。大きなサイズのファイルの場合メモリを大量に使用するので、一般的にはreadNBytes(int)を使用する。 FileOutputStreamクラス バイトストリームをファイルへ出力します。 2. FileOutStreamクラスの主なメソッド void write(int) ファイルへ1バイト出力する。 void write(byte[]) ファイルへ複数バイトを出力する。 コードサンプル 以下の例はsample1.pngファイルを1024バイトずつ読み込んで、sample2.pngへコピーする例です。 FileInputStream fileInputStream = new FileInputStream("test/sample1.png"); FileOutputStream fileOutputStream = new FileOutputStream("test/sample2.png"); try ( fileInputStream; fileOutputStream; ) { byte[] data = null; while ((data = fileInputStream.readNBytes(1024)).length > 0) { fileOutputStream.write

[Java] 入出力ストリーム

Javaの入出力ストリームについてまとめていきます。 Fileクラス Fileクラスは、Java1.0の最初期からあるAPIで、ファイルやディレクトリのパスを表すクラスです。 あくまでパスを扱っているだけで、ファイルやディレクトリそのものを扱っているわけではない。 Fileオブジェクトの取得 コード例 File file = new File("output/data.txt"); この時オブジェクトはファイルパスを扱っているだけなので、output/data.txtの存在有無や書き込み権限にかかわらず、インスタンスを生成することが可能です。 Fileオブジェクトの主なメソッド boolean isFile() ファイルの場合にTrueを返す。 boolean isDirectory() ディレクトリの場合にTrueを返す。 long lastModified() ファイルの更新日付をUNIXタイムで返す。 String getAbsolutePath() ファイルの絶対パスを取得する。 String getCanonicalPath() ファイルの相対パスを取得する。 File[] listFiles() ディレクトリ配下のFileオブジェクトの配列を生成する。 File[] listFiles(FileFilter) FileFilter関数型インターフェースを引数に取り、条件に一致したFileオブジェクトの配列を生成する。 サンプル コード例 output配下の拡張子が「.txt」のファイル一覧を取得 ファイル名と最終更新日時を出力する File file = new File("output"); FileFilter filter = pathname -> pathname.getName().endsWith(".txt"); File[] files = file.listFiles(filter); Ar

[Java] ストリームAPI

ListやSetといったコレクションを扱う際に、すべての要素に処理を行う際、for文を使って順に要素を取り出していましたが、このような逐次処理を簡潔に記述できるようにしたStream<T>型がJava8で導入されました。 ここではStream API(以下ストリームAPI)の使い方についてまとめていきます。 ストリームAPIを使用する目的 ストリームAPIを使用する目的としては以下の通りです。 コレクションや配列の全要素に対して同じように変換する。 コレクションや配列の要素の合計や平均といった統計を取る。 コレクションや配列の要素に対して特定の条件でグルーピングやフィルターを行う。 コレクションや配列から特定の条件に合ったデータを検索する。 ストリームAPIは従来のfor文や拡張for文を置き換えるために用意されたAPIではない。 ストリームオブジェクトの取得 Iterableインターフェースから取得 java.lang.Iterableインターフェースのstream()メソッドで取得します。 コード例 List<String> list = new ArrayList<>(); list.add("Apple"); list.add("Melon"); list.add("Orange"); Stream<String> stream = list.stream(); Streamインターフェースから取得 コード例 Streamインターフェースのofメソッドからも可変長引数で取得することが出来ます。 Stream<String> stream = Stream.of("Apple", "Melon", "Orange"); Arraysクラスから生成 コード例 String[] arrays = {"Apple", "Melon", "Orange"}; Stream<String> stream = Arrays.stream(arrays

[Java] 並列処理 (Thread, Runnable)

Javaで並列処理(マルチスレッド)の実装についてのまとめです。 Javaで並列処理を実装するにはいくつか方法がありますが、ここではThreadクラスを継承する方法と、Runnableインターフェイスを実装したクラスを用意して、Threadクラスのインスタンスを生成する方法についてまとめます。 基本的な並列処理の実装 Threadクラスを継承する 実装 import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Thread t = new Thread() { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("sub:" + i); } } }; t.start(); for (int i = 0; i < 5; i++) { System.out.println("main:" + i); } } } 実行結果 実行結果は順不同で出力され、並列に処理されているのが分かります。 java ThreadTest.java main:0 sub:0 main:1 sub:1 main:2 sub:2 main:3 sub:3 main:4 sub:4 Runnableインターフェースを実装する 実装 import java.lang.Runnable; import java.lang.Thread; public class ThreadTest { public static void main(String[] args) { Runnable r = new Runnable() { @Override

[java] Optional<T>について

Optionalクラスは何らかの処理の結果を格納・保持するクラスです。 これまでは取得した値が空ではないか、またはnullではないかなど、取得結果について確認したうえで後続の処理を行っている場合があり、これが冗長・可読性低下の原因でした。 Java8から導入されたOptionalクラスを使うと、こういったケースが簡潔に記述できるようになりました。 ここではインスタンスの生成と、値を使用するにあたって利用する主なメソッドについてまとめておきます。 インスタンスの生成 OptionalのインスタンスはOptionalインターフェースに定義されたファクトリメソッドを使用して生成します。 1. Optionalインスタンスを生成するメソッド empty() 空のOptionalのインスタンスを生成する。 of(T value) nullを許容しない値を持ったOptionalのインスタンスを生成する。 nullを指定するとNullPointerExceptionが発生する。 ofNullable(T value) nullを許容し、nullを指定した場合は空のOptionalインスタンスを生成する。 emptyメソッド コード例 Optional<String> optional = Optional.empty(); System.out.println(optional); 実行結果 Optional.empty ofメソッド コード例 Optional<String> optional = Optional.of("test"); System.out.println(optional); 実行結果 Optional[test] ofメソッドにnullを指定するとNullPointerExceptionが発生する。 ofNullableメソッド コード Optional<String> optional = Optional.ofNullable(null); System.out.println(optional); 実行結果 Optional.e

[Java] Enum(列挙型)についてまとめ

Enum(列挙型)について 概要 Enumは同じカテゴリの定数をまとめて管理するためのもので、クラスのように扱うことができます。 なお、JVM上はクラスとして扱われるため、メソッドやコンストラクタを定義することもできます。 構文 アクセス修飾子 enum 列挙名 { 列挙子, 列挙子, 列挙子... } Enumの基本的な使い方 定義例 public enum Status { DISABLED, APPROVED, ENABLED } Enumを使った分岐処理 Status status = Status.APPROVED; switch (status) { case DISABLED: System.out.println("無効"); break; case APPROVED: System.out.println("承認"); break; case ENABLED: System.out.println("有効"); break; } 配列で列挙子をすべて取得する Status[] statuses = Status.values(); 列挙子を文字列で取得する Status status = Status.valueOf("APPROVED"); 存在しない列挙子を指定すると IllegalArgumentException が発生します。 列挙子に値を持たせる 構文 アクセス修飾子 enum 列挙名 { 列挙子(値), 列挙子(値), 列挙子(値)... private 型 フィールド; private コンストラクタ {} } 定義例 enum Status { DISABLED("無効"), APPROVED("承認"), ENABLED("有効"); private String value; Status(String

[Java] ラムダ式と関数型インターフェース

ラムダ式とは前述の匿名クラスの記述をより簡潔に書くことが出来る記述法で、Java8から導入されました。 また、それに合わせてラムダ式で記述できるいくつかの関数型インターフェースが用意されているので、主要な部分についてまとめていきます。 ラムダ式 構文 インターフェース 変数 = (引数) -> {処理}; 定義例 例えば匿名クラスの説明で利用した次のサンプルコードがあります。 https://www.s-watanabe.work/2022/10/java.html#3 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = new Itest() { @Override public void doTest() { System.out.println("Itest.doTest"); } }; itest.doTest(); } } このコードはラムダ式によって次のように置き換えることが出来ます。 interface Itest { public void doTest(); } public class AnonymousTest { public static void main(String[] args) { Itest itest = () -> { System.out.print("Itest.doTest"); }; itest.doTest(); } } 処理内容が1行の場合、中カッコ{}を省略することができます。 Itest itest = () -> System.out.print("Itest.doTest"); ラムダ式は関数型インター