2

現在、すべての静的フィールドを次のように宣言しています。

public static final int EXAMPLE_OF_STATIC_FIELD = 0;

クラス内で発生する可能性のあるすべてのエラーを表すフィールドを持つ基本クラスがあるとします。

public class Base {

    public static final int ERROR_1 = 0;
    public static final int ERROR_2 = 1;
    public static final int ERROR_3 = 2;

}

この基本クラスを拡張Error typesし、クラスにさらに追加したい場合は、次のようにします。

public class OffSpring extends Base {

        public static final int NEW_ERROR_1 = 3;

    }

new を宣言するには、基本クラスのfromの値Error typesを知る必要がありますError types。これは (私の意見では) あまり便利ではありません。 . 例えば:Error TypeBase classError typeBase class

public static final int NEW_ERROR_1 = 0;

これはと同じです

public static final int ERROR_1 = 0;

これは競合します...

を使用することを考えEnum Classましたが、拡張できないことがわかりました。 列挙型をサブクラス化して新しい要素を追加できますか?

別のオプションは、すべての静的フィールドに int 値タイプの代わりに String 値タイプを使用することですが、これはあまり効率的な解決策ではありません...

スーパークラスと競合することなく、クラスの子孫にフィールドを追加するにはどうすればよいですか?

4

3 に答える 3

3

本当にやりたいのか疑問です。定数が宣言クラスに対して非公開である場合、同じ値を再利用することが問題になるのはなぜでしょうか? 異なるエラーが同じ値を使用しないことが重要なコンテキストがある場合、それは実際にはプライベートであってはならないことを強く示唆しています。

実際にこれを行いたい場合は、次のようにすることができます。

public class Base {
    private static final int ERROR_1 = 0;
    private static final int ERROR_2 = 1;
    private static final int ERROR_3 = 2;
    protected static final int LAST_ERROR = ERROR_3;
}

public class OffSpring extends Base {
    private static final int NEW_ERROR_1 = Base.LAST_ERROR + 1;
}

Baseただし、それぞれが独自のエラー コードを定義する複数のサブクラスが必要な場合は、問題が発生します。

于 2013-01-20T18:06:27.350 に答える
2

private static final継承された属性ではないため、問題はわかりません。OffSpring.ERROR_1存在しないとアクセスできなくなります。したがって、エラーを使用する場合は、列挙型を使用して適切な方法で使用することを選択できます。整数を好むのは、エラーの組み合わせのようなハックを使用したいため、 value を使用できないためです3

エラーの組み合わせを何と呼びますか? 2 つのエラー (ERROR_1 が 1 の場合は ERROR_1 と ERROR_2 は ERROR_2 が 2 の場合) が原因でスクリプトが失敗したと想像してください。 10. 3 はそれら 2 の組み合わせ : 11.

すべてのカスタム エラーを一意に識別したい場合は、GUID ジェネレーターを使用します。たとえば、

public class GUIDGenerator{
    private int id = 1;
    public int getId(){
          return id++; 
    }
}
于 2013-01-20T18:05:38.457 に答える
1

エラータイプが宣言されているかどうかを確認できるように、エラータイプをマップに保存しないのはなぜですか。それがあなたがしたいことだからです。

持っていMap<String, int> error_typesます。さらに追加し続けると、基本クラスをチェックして衝突を回避できます。

于 2013-01-20T18:05:36.353 に答える