この記事の目的
多くのプログラミング言語には、オブジェクトの比較のための機能が用意されています。
今回取り扱う「定数を左に書く」という原則は、JavaやC、C++などでは推奨されていますが、Nullセーフティ(null参照によるエラーを防ぐための概念)が確保されている言語ではあまり重要ではありません。
他言語を学ぶ際にも役立つ知識になりますので、定数を左側に書くべき理由をこの機会に覚えていただきたいです。
今回は、Javaのequalsメソッドを例としています。
equalsメソッドとは
まず、前提知識としてequalsメソッドの説明を行います。
equalsメソッドは、オブジェクトの比較を行うためのメソッドです。
2つのオブジェクトが同じ内容かどうかを判断する目的で使用されます。
equalsメソッドの使い方
ここでは、equalsメソッドの基礎的な使い方をご紹介します。
基本的な使い方
equalsメソッドは「equals」を挟んで記述された文字列を比較します。その際、定数と呼ばれる、ダブルクォーテーション(”)で囲まれた文字列を左側に書きます。
構文
"文字列A".equals(文字列B)
例
String str = "りんご";
if ("りんご".equals(str)) {
System.out.println(str);
}
実行結果
りんご
equalsメソッドの否定
equalsメソッドを否定するには、==の否定と同じく「!」を記述することで行います。
例
String str = "みかん";
if (!"りんご".equals(str)) {
System.out.println(str);
}
実行結果
みかん
定数を左に記述する
equalsメソッドを使う際は、常に定数を左側に配置することが推奨されています。
定数を左側に記述することで、右側の変数がnullであった場合でもNullPointerExceptionの発生を避けることができるためです。
NullPointerExceptionは、Javaプログラム内で発生する可能性が高い例外で、参照値がnullである(参照値がない)場所にアクセスしようとした際に発生します。
例
String str1 = "おはよう";
String str2 = "こんにちは";
String str3 = null;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equals(str3)); // false
System.out.println(str3.equals(str1)); // 例外発生
実行結果:
false
false
Exception in thread "main" java.lang.NullPointerException
At Exception.main(Exception.java:10)
理由
nullを含む比較でも、nullが左側にあるか右側にあるかで動作が異なるのは、equalsメソッドを呼び出しに関係しています。
左側にnullがある場合、null.equals(…)の呼び出しができないため例外が発生しますが、右側にnullがある場合、呼び出しは問題なくできるため例外の発生を防ぐことができます。
equalsメソッドの内容は以下のようになっています。(JavaSE-21)
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRING || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
equalsメソッドでは、if文でequalsの左側と右側の内容が等しいかを比較し、等しいならequalsメソッドから元のメソッドに戻るようにしています。if文でtrueを返さなかった場合は下の処理を始めます。
5行目からのreturn文は、「new String()」などでthisとanObjectのオブジェクトが異なる際に、String型であるか、文字列は等しいかなどを確かめるような内容になっています。
equalsメソッドが呼び出された際、右側にnullがある場合は引数としてnullが「anObject」に渡され、処理が始まります。この時、thisはequalsの左側に記述された文字列です。
thisは自分自身のオブジェクトを指します。しかし、nullはオブジェクトではありません。
よって、nullが左側に記述された場合、equalsメソッドを呼び出すことができず、例外が発生します。
equalsメソッドを使ったサンプルコード
それでは、equalsを使ったサンプルコードを書いてみましょう。
サンプルコード
public class Sample {
public static final String CONSTANT_STRING = "Hello";
public static void main(String[] args){
String variableString = null;
// 定数を右に置いた場合
try {
if (variableString.equals(CONSTANT_STRING)) {
System.out.println("1.表示されません");
}
} catch (NullPointerException e) {
System.out.println("NullPointerExceptionが発生しました");
}
// 定数を左に置いた場合
if (CONSTANT_STRING.equals(variableString)) {
System.out.println("2.表示されません");
} else {
System.out.println("変数がnullのため、一致しません");
}
}
}
実行結果
NullPointerExceptionが発生しました
変数がnullのため、一致しません
まとめ

今回は、定数を左に置く理由について触れてきました。
比較メソッドを正しく理解することは、プログラミングにおいて非常に重要です。
特に、例外を避けるためのテクニックは、どの言語でも役立ちます。
普段から意識しておきましょう!
無料のプログラミングスクール「テクドリ」の卒業生のインタビュー動画を、インスタグラムほか公式SNSにて公開中!