Javaの構文

Javaクラスの構文について説明します。
Javaクラスの構文の骨格は以下の図のようになっており、実にシンプルです。

javaの構文における骨格の画像

基本スタイル(再掲)

初めてのJava
/**
 * Copyright 2017 hoge.
 * 本ソースファイルの著作権は株式会社hogeに所属します。
 * 株式会社hogeの許可なくして、本ソースファイルの
 * 配布、改修、コピー、利用を禁止します。
 * 会社名				:株式会社hoge
 * 組織名				:システム開発部
 * プロジェクトコード	:education
 * バージョン			:1.0
 * 最終更新日時			:2017/02/10 17:21
 */

//package宣言部
package jp.co.yourcompany.education.samples;

//import 宣言部

/**
 *
 * このクラスは、Javaの全体の構成を分かり易くした
 * 標準出力にメッセージを出力するクラスです。
 *
 * @author Raita.Kuwabara
 *
 */
public class HowToWriteJava {

	//定数宣言部

	/**
	 * デフォルト値として設定されるメッセージ
	 */
	public static final String MESSAGE_DEFAULT_JA = "こんにちは 日本へ";

	/**
	 * エラーメッセージ
	 */
	public static final String MESSAGE_ERROR_JA = "メッセージが指定されていません。";

	/**
	 * 主処理の終了メッセージ
	 */
	public static final String MESSAGE_END_JA = "-------- END outputMessage method------------";


	//static実行部 今は気にしない

	//メンバフィールド宣言部
	private String message;

	/**
	 * デフォルトコンストラクタ
	 */
	public HowToWriteJava() {
		message = MESSAGE_DEFAULT_JA;
	}

	/**
	 * デフォルトコンストラクタ
	 * 指定したメッセージをmessageフィールドに初期設定する。
	 *
	 * @param message 出力するメッセージ
	 */
	public HowToWriteJava( String message ) {
		//クラスのメンバフィールドに値を設定しています。
		this.message = message;
	}

	/**
	 * 主処理
	 * messageプロパティに設定されたメッセージを出力します。
	 */
	public void outputMessage() {

		if( isNotNullMessage() ){
			outputCurrentMessage();
		} else {
			outputErrorMessage();
		}

		outputEndMessage();

	}


	/**
	 * メッセージを初期化する。
	 */
	private void init() {
		message = null;
	}

	/**
	 * メッセージフィールドのメッセージがnullでないことをチェックする。
	 * @return true:値あり false:値なし
	 */
	private boolean isNotNullMessage() {
		return ( message != null );
	}

	/**
	 * messageフィールドに設定された文字列を出力する。
	 */
	private void outputCurrentMessage() {
		System.out.println( message );
	}

	/**
	 * エラーメッセージを出力する。
	 */
	private void outputErrorMessage(){
		System.out.println( MESSAGE_ERROR_JA );
	}

	/**
	 * 主処理終了時のメッセージを出力する。
	 * @return true:値あり false:値なし
	 */
	private void outputEndMessage() {
		System.out.println( MESSAGE_END_JA );
	}

	/**
	 * 決まったユーティリティのような定型の関数のようなメソッドだけをstaticにする。
	 * クラスメソッド(静的メソッド)の例
	 * クラスの定型メッセージを出力します。
	 */
	public static void outputClassMessage() {
		System.out.println( HowToWriteJava.MESSAGE_DEFAULT_JA );
	}


	/**
	 * javaコマンドで起動されるmainメソッド
	 * @param args javaコマンドで引き渡しされる引数
	 */
	public static void main( String[] args ) {
		//sample1-1 デフォルトのメッセージ
		HowToWriteJava howToWriteJava = new HowToWriteJava();
		howToWriteJava.outputMessage();

		//sample1-2 outputErrorMessageが実行されるケース
		howToWriteJava.init();
		howToWriteJava.outputMessage();

		//sample2 引数を渡すケース
		HowToWriteJava howToWriteJava2 = new HowToWriteJava("インスタンス2のHello");
		howToWriteJava2.outputMessage();

		//sample3
		HowToWriteJava.outputClassMessage();
	}
}
					 
				

Javaの記述ルール

  • Javaは記述されたプログラムの大文字と小文字を区別しています。
  • Javaは「日本語」をコメント以外で利用使わない。
  • 「日本語」メッセージなどは、プロパティファイルなどの外部設定ファイルにして利用します。
    ※.上記HowToWriteJavaの固定値宣言部は本来プロパティファイルから取得した方が良いです。
  • Javaの記述形式に縛ばりは少ないが、命名規則やコーディングルールなど中から大規模システムには、
    顧客、メーカ、SIerによって、必ず存在します。

Javaクラスの定義

Javaクラスの定義
public class クラス名 {

}

  • クラス名は、英文字で「アッパーキャメルケース」を利用します。
  • アッパーキャメルケースとは、「howtowritejava」という言葉を「HowToWriteJava」と単語の区切り文字の先頭を大文字で記述します。
  • publicは、アクセス修飾子を意味しこのクラスが他のパッケージからも利用可能なクラスを意味します。
  • アクセス修飾子を指定しない場合には、そのクラスのパッケージ階層と同階層のパッケージのクラスからだけ利用できます。
  • import宣言部の後に定義します。

パッケージ宣言部

package 構文
package パッケージ名;

パッケージ名の接頭辞は、常に小文字のASCII文字で書かれており、トップレベルのドメイン名、
現在はcom、edu、gov、mil、net、org、または英語の2文字コードのいずれかでなければなりませんISO規格3166,1981に規定されている国を特定します。
 パッケージ名の後続のコンポーネントは、組織独自の内部命名規則に従って異なります。
このような規則は、特定のディレクトリ名の構成要素が部門名、部署名、プロジェクト名、マシン名、またはログイン名であることを指定します。

Oracle社「9 - Naming Conventions」より引用。
  • パッケージ宣言は、ライセンスコメント欄の直後及びクラスコメント欄(クラス宣言部)の直前に記載します。
  • パッケージ名が多階層になっている理由は、アプリケーション内に外部ライブラリも含めユニークになるようにすることが目的です。
  • 上記内容を要約すると日本では、トップドメイン(ジェネレル又は国別).ドメイン名.プロジェクトコード.サブプロジェクトコード.機能分類」が慣習になっています。
  • 例) jp.co.yourcomapny.education.samples

import宣言部

import 構文
import 利用するクラスの完全修飾名;
import宣言部例
//import宣言部
import java.util.Calender;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.yourcompany.education.samples.BoxOnly;
					
  • import宣言部は、 package宣言部の後に記述します。
  • importは、そのクラス内で利用される自パッケージ以外のクラスを利用することを意味します。
  • Javaの基本型のラッパークラス(String,Integer,Floatなど)、Systemクラス、Thread等のjava.langパッケージに所属するクラスの利用にimport節は不要です。
    コンパイラ時にclassファイルを生成する時に自動的に参照されます。
  • importで指定するクラス名は、完全修飾名でパッケージ名つきのクラス名で宣言します。
  • importで指定するクラス名は、パッケージ名.* でパッケージ名に属する全てのクラスを利用できます。
    重要import節は、作成したクラスが依存(利用している)クラスを表現しているので、「*」で表現されると依存関係が目視で判断できないため、利用してはいけません。
  • import節の並び順は、JavaSE,JavaEE,JavaME,JavaFXのライブラリ順に利用するクラスをimportします。
  • 続けて、オープンソースなどのクラスをimportします。
  • 最後に貴方が開発しているプロジェクトのクラスをimportします。これらは構文ではなくJavaのお作法です。

定数宣言部

Javaの定数 構文
public static final 定数の型 定数名 = 定数値;
定数のサンプル
	/**
	 * 主処理の終了メッセージ
	 */
	public static final String MESSAGE_END_JA = "-------- END outputMessage method------------";
					
  • publicは、アクセス修飾子で他のアクセス修飾子と動きは同じです。
    省略すると作成したクラスのパッケージに属するクラスだけが利用できます。
  • finalは、final修飾子と呼びます。
    上記のように宣言することで変更できない定数値になります。
  • staticは、static修飾子と呼びます。
    static修飾子で宣言されたプロパティは、クラスのインスタンスがnewで幾つ作成されても、
    メモリ上には、最初にクラスが参照されたときの1か所にしか値を保持されていません。
  • 定数の型には、プリミティブ型(int,float,charなど)、ラッパークラス(Integer,Float,String),オブジェクトを指定します。
  • 定数名には、固定値と分かるように英文字と「_(ハイフン)」で宣言します。

メンバ変数(フィールド)の定義

メンバ変数(フィールド)の定義
アクセス修飾子 メンバ変数の型 メンバ変数名 = 初期値;
メンバ変数のサンプル
	//出力するメッセージ
	private String message = null;
					
  • アクセス修飾子は、クラスや定数のアクセス修飾子と動きは同じです。
    省略すると作成したクラスのパッケージに属するクラスだけが利用できます。
  • メンバ変数の型には、プリミティブ型(int,float,charなど)、ラッパークラス(Integer,Float,String),オブジェクトを指定します。
  • メンバ変数は、英字のローワーキャメルケースを利用します。
    ローワーキャメルケースとは、頭文字の先頭を小文字に単語の区切れを大文字にします。
    例)lastNanme や firstName
  • 初期値に具体的な値が設定しない場合には、「null」を明示して下さい。省略してもnullになりますが。
  • オブジェクト指向言語のカプセル化(クラスのメンバ変数を公開しない)の概念から、特定の理由がない限り、
    アクセス修飾子はprivateまたはprotected(子クラスのみ利用可能)」にして下さい。
  • このメンバ変数をgetter/setterなどのメソッドで公開したのをプロパティと呼びます。

コンストラクタの定義

コンストラクタの定義
public クラス名 ( 引数定義部 ){
  //ここにオブジェクトが生成されたきの処理
}
コンストラクタのサンプル
public class Test{

	//メッセージ
	private String message = null;

	/**
	 * デフォルトコンストラクタ
	 * @paaram メンバ変数のメッセージを設定します。
	 */
	public Test( String message){
		this.message = message;
	}
}
						
コンストラクタの利用方法
public class ExecTest{

	public static void main( String[] args ){
	//デフォルトコンストラクタが実行される。
	Test test = new Test("Java学習中");
	}
}
						
  • デフォルトコンストラクタは、メンバ変数宣言部の後に定義します。
  • 作成したクラス名と同じ名前を定義します。
  • アクセス修飾子は、publicで宣言します。これはお作法です。
  • クラスのインスタンスが生成された瞬間に記述した処理内容が実行されます。
  • クラスの初期処理、初期準備などの目的で利用されます。
  • 引数無し、引数有(引数N)と引数の数と型が一致しなければ複数宣言できます。
  • インスタンスが生成された時に何か初期処理をしたいクラスのみ記述します。
    記述することが、必須ではありません。

メソッドの定義

メソッドの定義
アクセス修飾子 戻り値型 メソッド名 ( 引数宣言部 ){
 //処理したい内容
 //戻り値型を宣言している場合
   return hoge;
}
HowToWriteJavaよりメソッドのサンプル
	/**
	 * 主処理
	 * messageプロパティに設定されたメッセージを出力します。
	 */
	public void outputMessage() {

		if( isNotNullMessage() ){
			outputCurrentMessage();
		} else {
			outputErrorMessage();
		}

		outputEndMessage();

	}
  • メソッドとは、クラスに対する操作・クラスが実行できる処理を意味します。
  • オブジェクト指向言語では、このメソッドの定義方法がクラスの良し悪しを決める重要な要素の1つです。
  • アクセス修飾子は、public,protected,public省略から指定します。
  • アクセス修飾子は、publicで他のパッケージに公開されたメソッドは、そのクラスの主処理の1つとなります。
  • メソッドは、100行以内に収まるように記述します。
    処理内容が多い場合には、機能構成を分割し、公開する必要のない機能をprivateメソッドを作成します。
    これにより主処理の可読性が向上します。
  • 引数宣言部には、そのメソッドに利用するオブジェクトを引き渡しします。
  • 戻り値が存在する場合には、オブジェクト型を記述します。
    戻り値が存在しない場合には、voidを記述します。
  • 戻り値が存在する場合には、メソッドの処理部で return句で呼び出し元のクラスに戻り値を返します。

メソッドの引数

メソッドの引数に引き渡し方に基本は以下になります。

メソッド名( 型1 引数名1 , 型2 引数名2)
アクセス修飾子 戻り値型 メソッド名 ( 型1 引数名1 , 型2 引数名2 )

ジェネリクス型で詳しく説明しますが、
引数がListクラスなどのコンテナの場合には、コンテナに梱包するクラスをシェネリクス型で明示します>

ジェネリクス型で型を明示した引数
    /**
     * List<String>の引数の引渡し方例
     * @param 郵便番号のリスト
     */
    public void setZipList( List<String> zipList) {
        //doSomething;
    }
	

メソッドの引数(可変引数)

メソッドの引数のが可変の場合には、「...」型と引数名の間に「.」(ドット)を3つ並べます。

可変引数
アクセス修飾子 戻り値型 メソッド名 ( 型1 ... 引数名1 , 型2 引数名2 )
  • メソッドとは、クラスに対する操作・クラスが実行できる処理を意味します。
  • オブジェクト指向言語では、このメソッドの定義方法がクラスの良し悪しを決める重要な要素の1つです。
  • アクセス修飾子は、public,protected,public省略から指定します。
  • アクセス修飾子は、publicで他のパッケージに公開されたメソッドは、そのクラスの主処理の1つとなります。
  • メソッドは、100行以内に収まるように記述します。
    処理内容が多い場合には、機能構成を分割し、公開する必要のない機能をprivateメソッドを作成します。
    これにより主処理の可読性が向上します。
  • 引数宣言部には、そのメソッドに利用するオブジェクトを引き渡しします。
  • 戻り値が存在する場合には、オブジェクト型を記述します。
    戻り値が存在しない場合には、voidを記述します。
  • 戻り値が存在する場合には、メソッドの処理部で return句で呼び出し元のクラスに戻り値を返します。

mainメソッドの定義

main メソッドの定義
public static final void main ( String[] args ){
//ここからJavaプログラムが呼び出しされる。 }
  • mainメソッドとは、他のメソッドと異なり、Javaコマンドから直接呼出しされるメソッドです。
    そのため、全てのクラスに定義する必要はありません。
  • mainメソッドのString[] argsには、javaコマンド実行時に指定した引数が設定されてきます。