Java : 標準APIにならう命名規則
この記事では、Java標準APIでよく使われている命名規則を紹介します。
自分でクラスを設計するときには、なるべく標準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 18 & JDK 18)クラスのサブクラスの命名として、~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 |
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 | 火曜日 |
関連記事
- 公式ドキュメントのリンク集
- コメントが少なくて済むコードを目指そう
- シングルトン・パターンの乱用はやめよう
- メソッドのパラメータ(引数)は使う側でチェックしよう
- 不変オブジェクト(イミュータブル) とは
- 依存性の注入(DI)をもっと気軽に
- 不要になったコードはコメントアウトで残さずに削除しよう
- 簡易的な Builder パターン
- 読み取り専用(const) のインタフェースを作る
- 図解/デザインパターン一覧 (GoF)
- Abstract Factory パターン
- Adapter パターン
- Bridge パターン
- Builder パターン
- Chain of Responsibility パターン
- Command パターン
- Composite パターン
- Decorator パターン
- Facade パターン
- Factory Method パターン
- Flyweight パターン
- Interpreter パターン
- Iterator パターン
- Mediator パターン
- Memento パターン
- Observer パターン
- Prototype パターン
- Proxy パターン
- Singleton パターン
- State パターン
- Strategy パターン
- Template Method パターン
- Visitor パターン