14.1 Eclipseによる開発支援機能とデバッグ～Java Basic編

### はじめに

#### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。
様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」（2007年）](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」（2017年）](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**（**Jakarta EE**）を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、（Javaに限定されない）比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです（中級者向け）。

#### Udemy講座のご紹介

この記事の内容は、私が講師を務めるUdemy講座『**Java Basic編**』の一部の範囲をカバーしたものです。『**Java Basic編**』はこちらの[**リンク**](https://www.udemy.com/course/learn-java-se-basic/?referralCode=594C958456356851C97C)から購入できます（セールス対象外のためいつも同じ価格）。また**定価の約30%OFFで購入可能なクーポン**をQiita内で定期的に発行していますので、興味のある方は、ぜひ私の他の記事をチェックしてみてください。

この講座は、以下のような皆様にお薦めします。
* Javaの言語仕様や文法を正しく理解すると同時に、現場での実践的なスキル習得を目指している方
* 新卒でIT企業に入社、またはIT部門に配属になった、新米システムエンジニアの方
* 長年IT部門で活躍されてきた中堅層の方で、学び直し（リスキル）に挑戦しようとしている方
* 今後、フリーランスエンジニアとしてのキャリアを検討している方
* 「**Chat GPT**」のエンジニアリングへの活用に興味のある方
* 「**Oracle認定Javaプログラマ**」の資格取得を目指している方
* IT企業やIT部門の教育研修部門において、新人研修やリスキルのためのオンライン教材をお探しの方

#### この記事を含むシリーズ全体像

この記事はJava SEの一部の機能・仕様を取り上げたものですが、一連のシリーズになっており、**シリーズ全体でJava SEを網羅**しています。また認定資格である「**Oracle認定Javaプログラマ**」（Silver、Gold）の範囲もカバーしています。シリーズの全体像および「Oracle認定Javaプログラマ」の範囲との対応関係については、以下を参照ください。

https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

## 14.1 Eclipseによる開発支援機能とデバッグ

### チャプターの概要

このチャプターでは、Eclipseによる開発支援機能の操作方法や、デバッグするための方法について学びます。

### 14.1.1 Eclipseによる主要な開発支援機能

比較的規模が大きな企業システムやWebアプリケーションなどになると、数多くのクラスを作成したり、ライブラリやフレームワークを利用したりしてアプリケーションを開発します。Eclipseには、数多くのクラスから構成される、規模が大きなアプリケーションを効率的に開発するための、様々な支援機能が備わっています。ここでは、その中から主要な機能をいくつか紹介します。

#### コマンドライン引数

コマンドライン引数とは、詳しくはチャプター21.4で取り上げますが、javaコマンドによってクラスを実行するときに、外部から文字列として渡される引数です。Eclipseでは、クラスを実行するときに、コマンドライン引数を指定することができます。コマンドライン引数を指定してクラスを実行するためには、いくつかの方法があります。
1つ目は、実行対象クラスをエディタで開いた状態で、メニューバーから「実行」->「実行構成」を選択する方法です。
別の方法としては、ツールバーから緑色の再生ボタンを押下して「実行の構成」を選択しても同じ挙動になります。またはコンテキストメニューから、「実行」->「実行の構成」を選択する方法もあります。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/db101cb4-fa10-cafc-cc1f-59dab52603b6.png)

すると、以下のようなポップアップウィンドウが立ち上がります。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/e374bdef-5012-4bba-a4ac-4570ac4ccc2e.png)

「Javaアプリケーション」から実行したいクラス名を選択し、「引数」タブを開きます。「プログラムの引数」にコマンドライン引数を空白区切りで入力し、「実行」します。

#### ゲッターおよびセッターの生成

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「getterおよびsetterの生成」を選択します。クラスに定義されている候補となるフィールドが一覧で表示されるため、ゲッターおよびセッターの対象にするフィールドをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/08644e2b-87aa-5f0c-91f4-da588a397eb8.png)

なおゲッターまたはセッターといった切り口で絞り込むことも可能なので、例えばイミュータブルオブジェクトにする場合はゲッターのみに絞り込みます。
このようにすると、選択されたフィールドからゲッターおよびセッターを自動生成することができます。この機能はとても使用頻度が高いため、覚えておくとよいでしょう。

#### メンバーのソート

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「メンバーのソート」を選択します。すると、宣言されているフィールドおよびメソッドを、特定のルールに基づいてソートすることができます。

#### コンストラクタの生成

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「フィールドを使用してコンストラクタを生成」を選択します。クラスに定義されているフィールドの一覧が表示されるため、コンストラクタの対象にするフィールドをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/42e10c6e-f036-a1ba-c4bc-b4ac67546ee1.png)

このようにすると、選択されたフィールドからコンストラクタを自動生成することができます。コンストラクタは、特にフィールドの数が多いケースや、何種類ものコンストラクタをオーバーロードするケースなどにおいて、コード記述の負担が大きくなりがちです。そのような場合にこの機能を使用すると、負担を大きく軽減することが可能になります。

#### hashCode()メソッドおよびequals()メソッドの生成

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「hashCode()およびequals()の生成」を選択します。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/9577deb2-8d93-7a21-0925-cb7ae870ff50.png)

このようにすると、hashCode()メソッドとequals()メソッドを自動生成することができます。

#### toString()メソッド生成
メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「toString()生成」を選択します。クラスに定義されているフィールドが一覧で表示されるため、toString()メソッドの対象にするフィールドをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/efe0c707-2a13-cc38-e732-6699b0c39e76.png)

このようにすると、選択されたフィールドからtoString()メソッドを自動生成することができます。

#### import文支援機能

Eclipseには、import文の記述を支援する機能が備わっています。
まず対象のクラスをハイライトし、CTRLキー＋スペースを押下すると自動的にimport文が生成されます。このとき候補になるパッケージが複数ある場合には、候補の中から1つを選択します。
別の方法としてメニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「インポートの追加」を選択することによりimport文を生成できます。
またこのようにimport文を追加していくと、import文が無秩序に並んでしまい、コードの見た目が損なわれます。そのような場合はメニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「インポートの編成」を選択します。するとimport文をソートしたり、適切に改行を入れたりすることで、見た目を整えることができます。

### 14.1.2 継承と委譲に関する開発支援機能

ここでは、継承と委譲に関する開発支援機能をいくつか紹介します。

#### 参照先クラスを開く
作成中のクラスが参照しているクラスやインタフェースに、CTRLキーを押しながらカーソルを充てると、「宣言を開く」「実装を開く」というメニューが表示されます。「宣言を開く」を選択すると、その型を宣言しているコードを開くことができます。また「実装を開く」を選択すると、その型を実装しているコードを開くことができます。
「宣言を開く」と「実装を開く」は、クラス型の場合はどちらも違いはありませんが、インタフェース型の場合は「宣言を開く」だとインタフェースのコードが開き、「実装を開く」だとそのインタフェースを実装しているクラスのコードが開く、という違いが生じます。

#### 呼び出し階層を開く

まずコードエディタ上でクラス、メソッド、フィールドなどの要素をハイライトします。そしてメニューバーの「ナビゲート」、またはコンテキストメニューから、「呼び出し階層を開く」を選択します。するとこのように「呼び出し階層ビュー」にクラスの階層化された呼び出し構造が、ツリー形式で表示されます。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/e776be17-35c5-4840-c5e0-6591d8885bf0.png)

この機能はアプリケーション全体の構造を把握したり、デバッグしたりするときに、特に重宝する機能でしょう。

#### 型階層を開く

まずコードエディタ上でクラスをハイライトします。そしてメニューバーの「ナビゲート」、またはコンテキストメニューから「型階層を開く」を選択します。するとこのように「型階層ビュー」に、クラスの継承関係がツリー形式で表示されます。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/3ffe5e67-05a1-c56b-327e-c96e1ac691f2.png)

このビューを見れば、対象クラス（ここではQuxクラス）が、どのクラスを継承しているのか、またはどのクラスに継承されているのかを把握することができます。この機能も前述した「呼び出し階層」と同様に、アプリケーション全体の構造を把握したり、デバッグしたりするときに役に立ちます。

#### メソッドのオーバーライド/実装

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「メソッドのオーバーライド/実装」を選択します。自身の親クラスやインタフェースに定義されている、実装可能なメソッドが一覧で表示されるため、対象とするメソッドをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/49da1aeb-37ce-5a28-608a-aa234b716f62.png)

このようにすると、選択されたメソッドのシグネチャを持つスケルトンが生成されるため、それに対して処理を実装します。

#### 親クラスからコンストラクタを生成

自クラスに定義されているフィールドからコンストラクタを生成する方法は既に紹介済みですが、クラス間の継承関係においては、親クラスに定義されているコンストラクタを呼び出すケースが多々あります。そのような場合はメニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「スーパークラスからコンストラクタを生成」を選択します。親クラス（スーパークラス）に定義されているコンストラクタの一覧が表示されるため、実装対象のコンストラクタをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/06511250-fd43-5487-cf83-b01bc3c740bd.png)

このようにすると、選択されたコンストラクタを呼び出すためのコンストラクタを、自動生成することができます。

#### 委譲メソッドの生成

メニューバーの「ソース」、またはコンテキストメニューの「ソース」から、「委譲メソッドの生成」を選択します。自クラスのフィールドに宣言された参照型（クラスやインタフェース）を、委譲先と見なした上で、委譲メソッドの候補が一覧で表示されるため、対象とするメソッドをチェックします。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/beea8d43-a62b-8fdd-df23-daedc887e511.png)

このようにすると、選択されたメソッドに委譲するための委譲メソッドのスケルトンが生成されるため、それに対して処理を実装します。

### 14.1.3 Eclipseのデバッグ支援機能

#### デバッグとは

デバッグとはプログラムに不具合やエラーが検出されたさいに、その発生箇所をソースコード上から特定し、不具合やエラーを引き起こす原因（これをバグと呼ぶ）を排除することです。
デバッグするためによく利用される古典的な方法には、以下のようなものがあります。
•	デバッグログの出力
•	コメントアウト
デバッグログとはデバッグのために出力されるログのことで、メソッド呼び出しの前後にメソッド名を出力したり、変数の内容を出力したりします。デバッグログは、JavaではOSSのロギングライブラリを使うのが一般的ですが、簡易的に`System.out.println()`もよく使われます。
またコメントアウトも良く使われる方法です。バグと思われる箇所をコメントアウトし、プログラムを実行して動作を確認します。これでエラーの発生が解消されれば、コメントアウトした箇所にバグが潜んでいる可能性が高いと判断できます。

#### Eclipseのデバッグ支援機能

Eclipseには、デバッグを効率的に実施するための支援機能が備わっています。EclipseではJavaプログラムを実行するとき、特定の箇所で処理を中断したり、1行単位に実行（これをステップ実行と呼ぶ）したりすることができます。またそのときに、変数の内容を参照することも可能です。

#### デバッグ実行

まずは処理を中断したいソースコード上の箇所に、マークを付けます。これをブレイクポイントと呼びます。ブレイクポイントは、コードエディタの行番号の左部分でダブルクリックすることで設定します。ブレイクポイントは、複数箇所に設定することができます。
ここではチャプター7.2で登場したCalculatorクラスのadd()メソッドと、このクラスの呼び出し元であるMain_Calculatorクラスに、ブレイクポイントを設定します。設定したブレイクポイントは、「ブレークポイントビュー」によって一覧で確認することができます。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/64622b61-a4a1-d8b5-7c74-d439566e29ba.png)

次にデバッグ実行します。Javaプログラムをデバッグ実行するには、幾つかの方法があります。1つ目はデバッグ対象のクラスを開いた状態で、メニューバーから「実行」->「デバッグ」->「Javaアプリケーション」を選択する方法です。
別の方法としては、ツールバーからデバッグボタンを押下しても同じ挙動になります。

![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/7ee0fd22-f933-65a2-44a3-8f123fcd1cf2.png)

またはコンテキストメニューから「デバッグ」->「Javaアプリケーション」を選択する方法や、ショートカットの「F11」を押下する方法があります。

それでは、Calculatorクラスをデバッグ実行してみましょう。メインメソッドを起点に処理が開始され、命令文が順番に実行されていきます。そして最初のブレイクポイントであるadd()メソッドの最初の行で、処理が中断されます。このとき、デバッグビューには中断されたスレッドのコールスタック（メソッド呼び出し階層）が表示されます。
また変数ビューを見ると、このメソッドにおける変数（xおよびy）の内容を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/5385d4ce-685a-6918-3b91-1613cf069a43.png)

#### 再開とステップ実行

中断した処理は、「再開」するか「ステップ実行」するかのどちらかになります。
「再開」すると、次のブレイクポイントまで一気の処理が進みます。「再開」するためには、デバッグビューの再開ボタンを押下するか、またはショートカットの「F8」を押下する方法などがあります。
ステップ実行すると、1行ずつプログラムが実行されていきますがステップ実行には2通りの方法があります。
1つ目は「ステップイン」です。これは中断中のクラスにおいてメソッド呼び出しがあった場合に、そのメソッドの内部に処理を進めることです。「ステップ・イン」するためには、デバッグビューの「ステップ・イン」ボタンを押下するか、またはショートカットの「F5」を押下する方法などがあります。
もう1つは「ステップ・オーバー」です。これは中断中のクラスにおいてメソッド呼び出しがあっても、そのメソッドの内部には処理を進めずに、中断中クラスの次の命令文に処理を進めることです。「ステップ・オーバー」するためには、デバッグビューの「ステップ・オーバー」ボタンを押下するか、またはショートカットの「F6」を押下する方法などがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597954/a57c1074-6deb-1e6c-dd56-c3190bd84852.png)

このようにEclipseのデバッグ支援機能を利用することにより、プログラムの動作を詳細に把握することができます。
簡易的なデバッグであれば、デバッグログ出力やコメントアウトといった古典的な方法も有効ですが、比較的規模の大きなアプリケーションにおいてデバッグする場合は、Eclipseのデバッグ支援機能を利用するとよいでしょう。

### このチャプターで学んだこと

このチャプターでは、以下のことを学びました。

1. Eclipseの基本的な開発支援機能について。
   * クラス実行時にコマンドライン引数を指定する方法
   * ゲッターおよびセッターの生成
   * メンバーのソート
   * コンストラクタの生成
   * hashCode()メソッドおよびequals()メソッドの生成
   * toString()メソッド生成
1. Eclipseの継承と委譲に関する様々な開発支援機能について。
   * 参照先クラスを開く
   * 呼び出し階層を開く
   * 型階層を開く
   * メソッドのオーバーライド/実装
   * 親クラスからコンストラクタを生成
   *	委譲メソッドの生成
1. Eclipseのデバッグ支援機能について。
   * デバッグ実行
   * 再開とステップ実行