Javaメソッドの順序付け規則はありますか?[閉まっている]


159

私はコースワークとして提出するパッケージの一部である大規模なクラス(40程度のメソッド)を持っています。現在、メソッドはユーティリティpublic / privateなどに関してかなりごちゃごちゃしていて、私はそれらを賢明な方法で注文したいと思っています。これを行う標準的な方法はありますか?たとえば、通常、フィールドはメソッドの前にリストされ、コンストラクタは他のメソッドの前にリストされ、ゲッター/セッターは最後に続きます。残りのメソッドはどうですか?


また、ときに注意作業のようなコードで、ほとんどのIDEのは、あなたが自動的にカーソルの下にあるのどんな定義を参照することができます。つまり、一目で確認する以外に何もする必要はありません。
–ThorbjørnRavn Andersen 2017

あなたは、単一のクラス内の40のメソッドを持っている場合-あなたは間違ったことをやっている
ベン・

回答:


132

一部の規則では、すべてのパブリックメソッドが最初にリストされ、次にすべてのプライベートメソッドがリストされます。つまり、インターフェースが存在しない場合でも、APIを実装から簡単に分離できます。

別のアイデアは、関連するメソッドを一緒にグループ化することです。これにより、既存の大きなクラスをいくつかのより小さくターゲットを絞ったクラスに分割できる継ぎ目を見つけやすくなります。


1
+1。私は可視性でソートすることを好みます。恥Eclipseは自動的にこれを行うことはできません(それは常に一緒にグループ一緒にすべてのコンストラクタとすべてのメソッド。)
finnw

16
@finnw、バグレポートを提出してください。見知らぬものはそこから実装されることが知られています。
–ThorbjørnRavn Andersen、2011

3
@ベン:私の経験では、「決して」例外はありません。
ジョンスキート、

1
@JonSkeetはいくつかのケースで、順序付け規則がもはや関係ない場合、たとえばクラスをテストします。悪いコードを書かない方が、悪いコードを配置する方法よりも良いアドバイスです。
ベン

1
@ベン:私は同意しないことに同意する必要があると思います。私は、多くのメンバーが懸念などの任意の分離に違反することなく、非常に自然に存在するコード書いた
ジョンスキート

121
  1. クラス(静的)変数:最初にパブリッククラス変数、次にプロテクト、次にプライベート。

  2. インスタンス変数:最初にパブリック、次に保護、次にプライベート。

  3. コンストラクタ

  4. メソッド:これらのメソッドは、スコープやアクセシビリティではなく、機能ごとにグループ化する必要があります。たとえば、プライベートクラスメソッドは、2つのパブリックインスタンスメソッドの間に置くことができます。目標は、コードの読み取りと理解を容易にすることです。

ソース:http//www.oracle.com/technetwork/java/codeconventions-141855.html


4
これは15年前のものであり、おそらく最新のIDEの登場で少し古くなっています...
アッシリアス2014年

16
@assylias:IMO、読みやすさはIDEから独立しています。通常、非公開より前に公開する方が良いでしょう。
saurabheights 2017年

40

«コード規約»へのより正確なリンク:«クラスとインターフェースの宣言»


8
+1、アファイク-これは実際に質問に答える唯一の投稿です。はい、OracleとSunによって規定された標準の順序があります。1。パブリックコメント、2。クラス、3。内部コメント、4。静的データ、5。インスタンスデータ、6。アクター、7。メソッド、および各セクショングループ内アクセシビリティではなく、論理的に。
John Henckel 2013年

@VadimKirilchuk«Internet Archive»がダウンしました…
Timofey Gorshkov


15

広く受け入れられている標準があるかどうかはわかりませんが、私自身の好みはそうです。

  • 最初にコンストラクタ
  • 次に静的メソッド、メインメソッドがある場合は常に他の静的メソッドの前
  • 次に、通常はメソッドの重要度の順に、その後に呼び出されるメソッドが続く、非静的メソッド。つまり、他のクラスメソッドを呼び出すパブリックメソッドは上に表示され、他のメソッドを呼び出さないプライベートメソッドは通常下に表示されます。
  • 標準のようなメソッドtoStringequalsおよびhashcode次の
  • ゲッターとセッターは、クラスの一番下に予約された特別な場所を持っています

適切に作成されたコンストラクターは、その引数をプロパティに割り当てる以外にほとんど何もしないので、私はコンストラクターが最後に来ることを本当に好みます。
GordonM 2016年

@GordonMなぜそう思いますか?私はその逆が真実であると主張するまで行きます。あなたは常にあなたのクラスのための最もきれいなAPIを考えるべきです。そして、それはしばしばそれらが格納される方法ではないので、私はしばしばこの負担から発信者を解放するためにかなりの処理をします
Neuron

@GordonM私は副作用について話していません。そのため、渡されたリストなどに変更はありません。値を渡して設定するだけでは、クラスがその実装について多くのことを伝える必要がありますが、そうではありません
Neuron

@LonelyNeuronここで何を言っているのかよくわかりませんが、コンストラクターは内部状態に引数を割り当てる以外に多くのセットアップ作業を行うべきだと言っているようです。これは間違いなく間違っています。なぜなら、「魔法」によって物事が起こっていることを意味するからです。への呼び出しnew Thing()は、インスタンス化される新しいものをもたらすだけです。これは、などなど、ファイルが書き込まれて、開かれているデータベース接続になってはならない
GordonM

@LonelyNeuronコンストラクターに依存関係があっても、その依存関係以外はクラスの実装について何もわかりません。これは良いことであり、悪いことではありません。
GordonM 2018

12

1つのクラスで40のメソッドは少し多くなります。

一部の機能を他の(適切な名前の)クラスに移動することは理にかなっていますか。そうすれば、理解するのがはるかに簡単になります。

数が少ない場合は、自然な読み順でリストする方がはるかに簡単です。頻繁パラダイムは、いずれかのリストの物事にあるまたは後にあなたがそれらを必要とするためには、あなたがそれらを必要とします。

これは通常main()、上または下になります。


1
youre so
right-

4
たとえば、多くのメソッドを持つインターフェースを実装している場合など、常に選択肢があるとは限りません。
finnw

5
これはAndroidアクティビティであるためonPause()、他の場所には行けないことがたくさんありますonResume()。また、すべてのOnClickListenerフィールドがフィールドですが、フィールドのように見えたり、動作したりしないので、それらを個別にリストしてください。
フレドリー、2011年

@finnw、抽象クラスはこの目的のために素晴らしく、使用可能です。
–ThorbjørnRavn Andersen、2011

11

私の「慣例」:インスタンスの前に静的、プライベートの前にパブリック、メソッドの前にコンストラクター、ただし下部にメインメソッド(存在する場合)。


2

また、Eclipseは、何らかの理由でそれらを混同した場合に、クラスメンバーを並べ替える可能性を提供します。

クラスファイルを開き、メインメニューの[ソース]に移動して、[メンバーの並べ替え]を選択します。

ここから抜粋:Eclipseでのソート方法


1

Eclipseを使用していますか?そうであれば、デフォルトのメンバーの並べ替え順序を使用します。これは、コードを読む人にとってはなじみがあるためです(ただし、私のお気に入りの並べ替え順序ではありません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.