14

私は同僚(別の学生)からのJavaコードの「静的」コードウォークスルーを行っています

私には、これは意味がありません。これらの「コンポーネント」オブジェクトを上から下に読み取ると、宣言される前にインスタンス化されます(後でコンストラクターで使用されます)。しかし、コードは問題なくコンパイルされて実行されます。これは悪い習慣ですか?

Public Class theObject {

    private static final long aVariable = 123123123123123;

    public theObject(...){

        componentOne = new Component(...);
        componentTwo = new Component(...);

        ...
        ...
        componentOne.doSomething(...);
    }

    private Component componentOne;
    private Component componentTwo;
}
4

7 に答える 7

46

Sun Microsystems (現在は Oracle に引き継がれています) は、1998 年にJava コーディング スタイル ガイドを発行し、その中で特定の組織をクラス宣言に推奨しました。

  1. 静的変数フィールドの宣言
  2. インスタンス変数フィールドの宣言
  3. 静的初期化子
  4. 静的メンバーの内部クラス宣言 [*]
  5. 静的メソッド宣言
  6. インスタンス初期化子
  7. インスタンス コンストラクターの宣言
  8. インスタンス メンバーの内部クラス宣言 [*]
  9. インスタンス メソッドの宣言

これにより、データ宣言がファイルの先頭に配置されることに注意してください。( 1997 年に発行された Sun の以前の出版物では、上記のリストのすべてが網羅されているわけではありません。) 唯一重要な順序は、静的フィールド内およびインスタンス フィールド内であり、フィールドに他のフィールドを参照する初期化子が含まれている場合のみです。フィールド自体が初期化される前に、イニシャライザでフィールドを使用することはできません。同様に、初期化子 (項目 3 または 6) は、代入の対象としての場合を除き、フィールドへの前方参照を作成できません。(このような前方参照の詳細については、Java 言語仕様のセクション 8.3.3を参照してください。) 私の知る限り、順序については他に問題はありません。

[*] 上記のリストの用語 (1998 年のガイドからそのまま引用されています) は、項目 4 と 8 に関して古くなっています。具体的には、ネストされたクラスに関する Java チュートリアルから:

用語:ネストされたクラスは、静的と非静的の 2 つのカテゴリに分けられます。宣言されたネストされたクラスは、 static ネストされたクラスstaticと呼ばれます。ネストされた非静的クラスは、内部クラスと呼ばれます。

現代の使用法では、「静的メンバーの内部クラス」などはありません。

于 2012-04-22T01:28:26.403 に答える
10

Java における一般的な宣言順序 (参考: Java Coding Style Guide )

     public class DeclarationOrder {

        // Class (static) variables
        public static int publicClassVariable;
        protected static int protectedClassVariable;
        static int defaultClassVariable;
        private static int privateClassVariable;

        // Instance variables
        public int publicInstanceVariable;
        protected int protectedInstanceVariable;
        int defaultInstanceVariable;
        private int privateInstanceVariable;

        // Constructors
        public DeclarationOrder() {
            // Public Constructor
        }
        protected DeclarationOrder(int var) {
            // Protected Constructor
        }
        DeclarationOrder(String var) {
            // Default Constructor
        }
        private DeclarationOrder(Double var) {
            // private Constructor
        }

        // Class (static) Methods
        public static void publicClassMethod(){}
        protected static void protectedStaticMethod(){}
        static void defaultStaticMethod() {}
        private static void privateStaticMethod(){}

        // Instance Methods
        public void publicInstaceMethod() {}
        protected void protectedInstanceMethod() {}
        void defaultInstanceMethod() {}
        private void privateInstanceMethod() {}
    }

各セット内の順序は、

  1. 公衆
  2. 保護された
  3. パッケージ レベル (アクセス修飾子なし)
  4. プライベート
于 2016-09-01T07:41:18.733 に答える
9

これについては、本当のコンセンサスはありません。ほとんどの人は、クラス実装の先頭でクラス変数を宣言し、その後にメソッドを記述しますが、これは必須ではありません。Code Complete などの一部の書籍では、変数を最初に使用するときと同じように宣言することを推奨しています。これにより、変数のスコープを最小限に抑えることができます。

于 2012-04-22T01:23:43.777 に答える
5

いいえ、それらは宣言される前にインスタンス化されません。初期化の順序は Java で固定されており、コード内のどこに宣言とコンストラクターを配置しても問題ありません。

慣習に関しては、それはあなたが何に慣れているかによって異なります. 真実は、最初にファイルを宣言し、次にコンストラクターを宣言するという慣例ですが、あなたのアプローチは、あなたの性質や会社の規則に反しない限り、他のアプローチと同じくらい有効です。

さらに、1 文字の変数やあまり一般的ではない構造 (複雑な条件の三項演算子など) の広範な使用など、コードを読みにくくする危険なものがコードに含まれています。適切な IDE であれば、どんな設定を行ってもコードを再編成できるため、コードの編成はさほど重要ではありません。

于 2012-04-22T01:24:21.013 に答える
3

クラスのメンバー (メソッド、属性) が宣言される順序は関係ありません。慣例により、最初にすべての属性と定数を宣言し、次にメソッドを宣言するのが一般的です。

たとえば、コードでは、クラスがコンパイルされるときにすべての属性宣言が考慮され、後でコンストラクターが実際に呼び出されるときに属性が考慮されるため、コンストラクターで属性を初期化してから属性宣言することができます。が見つかります。コンストラクターの属性はコンパイル時にアクセスされていないことに注意してください。これがエラーを生成しない理由です。実行時にのみアクセスされます。

于 2012-04-22T01:21:13.070 に答える
2

これは通常の規則に反しており、(そのため) 通常の規則に従うことを期待する人々、つまりほとんどの Java プログラマーにとってコードが読みにくくなります。

一方、コードが一貫してこれを行い、合意されたローカルコーディング規則に従っている場合、読者はそれに慣れます。

それで、 「これは悪い習慣ですか?」という質問に対する答えです。合意されたコーディング規則と、これについて何を言っているかに依存するということです。

しかし、メタ的な答えは、合意されたコーディング規則なしでコードレビューを行うことは本当に悪い考えだということです. コーディング規約がなければ、コード スタイルをレビューするための客観的な根拠がありません。あなたは悪い結果に終わる可能性があります。

于 2012-04-22T01:26:36.643 に答える