Java : 標準APIにならう命名規則

この記事では、Java標準APIでよく使われている命名規則を紹介します。
自分でクラスを設計するときには、なるべく標準APIにならって命名すると、他の人にも理解しやすいクラスとなるのでおすすめです。

Java SE 17 & JDK 17 API仕様

随時更新予定です。


用語説明

名称 説明
パスカルケース 複数の単語をつなげるときに、各単語の先頭文字を大文字にします。
例:ArrayList, InputStream
キャメルケース 単語のつなげかたはパスカルケースと同じですが、一番先頭の文字を小文字にします。
例:arrayList, inputStream

共通ルール

最も特徴づける単語を最後に

複数の英単語を使う命名、英語に慣れていないと意外と悩みませんか?(私は悩みます…)
その場合は、そのクラスを最も特徴づける単語を一番最後に配置しましょう。

  • ArrayList : (内部的には配列なんだろうけど)これはリストとして使えるんだなと理解できます。
  • ListArray : (内部的にはリストなんだろうけど)これは配列として使えるんだなと理解できます。
  • IconView : アイコンを表示するビューなんだなと理解できます。

※標準APIにListArrayクラスはありません。説明のための仮のクラス名となります。

動詞 + er となる単語は最後に

動詞 + er (もしくはor)で、~する者という名詞になります。

例:StringReader、DateTimeFormatter、Comparator、ChangeListener

これらは最後に配置しましょう。

~Factory

デザインパターンにもあるFactoryですね。
これも標準APIには多くあります。

例:DocumentBuilderFactory、PreferencesFactory、ThreadFactory

Factoryは最後に配置しましょう。

~Constants (定数)

定数を集めたクラスは~Constantsとします。
Constant(定数)の複数形です。

例えば、以下のようなクラスです。

public class AppConstants {

    public static final String VERSION = "1.0.2";
    public static final String LOG_NAME = "app-log";
    ...
}

標準APIにもいくつかあります。

例:XMLConstants、ObjectStreamConstants、SwingConstants

インタフェース名

パスカルケースで命名します。

補足
  • 言語によっては先頭の文字にインタフェースを表す"I"をつけることがあります。
    例:IComparable (C#)

  • Javaでは"I"はつけません。
    例:Comparable (Java)

名詞(単数形)

基本的な命名規則です。
名前がそのままそのインタフェースを特徴づけることになるので、命名者のセンスが問われます。

例:List、IntStream、Node

動詞 + able (形容詞)

~できる、という意味合いのインタフェースには形容詞(~able)が使われます。
クラスでは(おそらく)使われていなく、インタフェース特有の命名規則です。

具体例 説明
Runnable run(走る)にableがついた形です。スレッドを使ったことのあるかたにはおなじみのインタフェースですね。
Closeable close(閉じる)にableがついた形です。FileInputStreamやデータベースのConnectionなどで実装されています。
Iterable forEachなどで反復処理できるインタフェースです。

クラス名

パスカルケースで命名します。

名詞(単数形)

クラス名の多くは名詞(単数形)を使います。
すべてのクラスは暗黙的にObjectクラスを継承しているように、クラスはObject(物)、つまり名詞というわけですね。

例:Object、ArrayList、LocalDateTime

名詞(複数形)

ユーティリティクラスは名詞(複数形)で命名されることが多いです。
インスタンス化しないで、複数のstaticメソッドを持っている、ということからだと思います。

例:Arrays、Collections、Executors

補足

  • ユーティリティクラスとは、staticメソッドのみを持つインスタンス化しないクラスです。
    ヘルパークラスとも呼ばれます。

Abstract~ (抽象クラス)

抽象クラス (abstract class) は、Abstract~で命名されることが多いです。

例:AbstractList、AbstractMap、AbstractCollection

~Exception (例外)

独自に例外を作るときは、Exceptionを最後につけましょう。
標準APIでも最後にExceptionをつけています。

例:IOException、IllegalArgumentException

~Error は NG

最後に"Error"を配置したクラス名はおすすめしません。

標準APIでは、Error (Java SE 17 & JDK 17)クラスのサブクラスの命名として、~Errorを使っています。

例:OutOfMemoryError、AssertionError

また、独自にErrorクラスのサブクラスを作ることはまずないでしょう。
そのため、クラス名の最後に"Error"をつけると、Errorクラスのサブクラスだと誤認される可能性があります。

メソッド名

キャメルケースで命名します。

動詞

メソッド名は基本的に動詞を先頭に使います。
その中でもよく使われる表現をご紹介します。

set/get

set/getだけではなく、setProperty​/getProperty​のように後ろに具体的な名詞を付けることも多いです。

setは新規に追加するわけではなく、すでにあるものに上書きで設定する、というイメージです。
getはsetで設定したものを取得というイメージです。

具体例

クラス名 メソッド名
List E set​(int index, E element)
E get​(int index)
Properties Object setProperty​(String key, String value)
String getProperty​(String key)

add/remove

addは既存のものには上書きせず、新規に追加する、というイメージです。
removeはaddで追加したものを削除というイメージです。

クラス名 メソッド名
List E boolean add​(E e)
boolean remove​(Object o)

read/write, load/save

readとload、writeとsave、似たような意味だしどちらを使うべきか悩むかもしれません。
標準APIではどのように使い分けているかご紹介します。

readの例

クラス名 メソッド名
Files byte[] readAllBytes​(Path path)
Path write​(Path path, byte[] bytes, OpenOption... options)

Filesはファイルへのさまざまな操作を行うユーティリティクラスです。
このクラスでは、read/writeが使われています。(load/saveは使っていません)

ファイルそのものの読み書きに関しては、read/writeを使うのがよさそうです。

loadの例

クラス名 メソッド名
Runtime void loadLibrary​(String libname)
Properties void load​(Reader reader)

Runtime.loadLibraryは、ネイティブライブラリをロード(ファイルから読み込んでそれを実際に使えるように準備)します。

Properties.loadは、プロパティをロード(Readerから読み込んでgetPropertyで取得できるように準備)します。

readとloadの違い

英語の正確なニュアンス的なものはさておき、おおざっぱな使い分けは以下のような認識でいます。

  • readは単純に読むことを目的としている。
  • loadは読み込んでそれを使える状態に準備することも含む。

動詞(三人称単数)

例えばAというクラスがあり、そのAクラスそのものが主語となり、戻り値がbooleanとなる場合は、動詞に三単現のsをつけます。

クラス名 メソッド名
Object boolean equals​(Object obj)

equalsはequal(等しい)という動詞に三単現のsをつけた表現です。
上記の例では、Objectクラスパラメータobjと等しいか?となり、Objectクラスが主語となります。

クラス名 メソッド名
List boolean contains​(Object o)

Listクラス指定したパラメータoを含んでいるか?ですね。
List以外(Stringなど)でもよく見るメソッドです。

動詞(三人称単数ではない)具体例

クラス名 メソッド名
List void clear()

Listクラス、要素のすべてを削除して、ということを命令しています。
Listクラスは主語ではありません

いかがでしたでしょうか?
三単現のsが必要となる動詞はそんなに多くはない印象です。(equals, contains, existsなど)
どちらかというと、is + 形容詞の形式をよく見かけます。

is + 形容詞

動詞(三人称単数)と同じで、自身が主語となり、戻り値がbooleanとなる場合に使います。

クラス名 メソッド名
String boolean isEmpty()

インスタンスが空かどうかを判定します。
よく見かけるメソッド名です。汎用的でよいですね。

クラス名 メソッド名
Path boolean isAbsolute()

パスが絶対パスかどうか判定します。
absoluteは「絶対的な」という形容詞です。

can + 動詞

~することができるかどうか、という判定に使います。

動詞(三人称単数)と同じで、自身が主語となり、戻り値がbooleanとなる場合に使います。

クラス名 メソッド名
AccessibleObject boolean canAccess​(Object obj)
CharsetEncoder boolean canEncode​(char c)

is + 形容詞よりかは少ない印象です。

to + 名詞

自身を~へ変換する、という意味になります。

メソッド名は基本的に動詞を使うのですが、これは例外の1つですね。

クラス名 メソッド名
Object String toString()
List Object[] toArray()

of

標準APIでは、インスタンスを取得するstaticなメソッド名としてよく使われています。
インスタンスを新しく生成、というよりは、不変(イミュータブル) なインスタンスを返す、という印象です。

クラス名 メソッド名 補足
List static List of() ofで取得したListにsetやaddで変更を加えようとするとUnsupportedOperationExceptionが発生します。つまり変更はできません。
LocalDateTime static LocalDateTime of​(int year, int month, int dayOfMonth, int hour, int minute) LocalDateTimeはもともと不変クラスです。(Stringと同様)
Path static Path of​(String first, String... more) Pathも不変クラスです。

パラメータ名

キャメルケースで命名します。

名詞(単数形)

パラメータは、クラス(名詞)をインスタンス化したものなので、基本的には名詞で命名します。

複数形

Listや配列、可変長パラメータといった複数の値を持つものは複数形にします。

クラス名 メソッド名
Files static Path write​(Path path, byte[] bytes, OpenOption... options)

bytesはbyteの複数形、optionsはoptionの複数形です。

複数形が存在しない名詞や、単数形だと思っていたものが実は複数形だった、ということもあるので注意。

  • data : "data"は複数形です。"datas"という単語はないので注意。
  • information : 複数形はありません(不可算名詞です)。"informations"という単語はないので注意。

フィールド定数名

すべて大文字で、単語の区切りは _ (アンダーバー) とします。

具体例

クラス名 フィールド定数名 説明
Integer MAX_VALUE int型の最大値(2147483647)です。
MIN_VALUE int型の最小値(-2147483648)です。
HttpURLConnection HTTP_OK HTTPステータスコードの 200(OK) です。
HTTP_NOT_FOUND HTTPステータスコードの 404(リソースが見つからない) です。

列挙型名

パスカルケースで命名します。(クラス名と同じです)

例:StandardOpenOption (ファイルオープンの標準オプション)、DayOfWeek (曜日)

列挙型定数名

すべて大文字で、単語の区切りは _ (アンダーバー) とします。(フィールド定数名と同じです)

具体例

列挙型 列挙型定数名 説明
StandardOpenOption CREATE_NEW ファイルを開くときのオプション。
新しいファイルを作成し、ファイルがすでに存在する場合は失敗。
DELETE_ON_CLOSE 閉じるときに削除します。
DayOfWeek MONDAY 月曜日
TUESDAY 火曜日

関連記事

ページの先頭へ