システムを構築するとき、多くの場合、エラー コードやエラー メッセージを含む多くのエラー クラスを定義する必要があります。 ほとんどの場合、最初にエラー コードのセットを定義し、次にエラー メッセージのセットを定義するなど、最も伝統的な方法を使用します。エラー メッセージはプロパティ ファイルまたはデータベースに配置され、プロパティ ファイルまたはデータベースの作成時にメモリにロードされます。システムが起動し、マップに配置されます。ニュートラル コードとエラー コードの間には 1 対 1 の対応があり、エラー情報はエラー コードを通じて取得され、使用中にユーザーに返されます。 その後、JAVA にカスタム Annotation が登場し、エラー メッセージ クラスを管理するためのよりエレガントな方法が提供されました。以下に小さなデモが記載されています。興味があれば参照してください。 JAVA カスタム アノテーションは、特にフレームワーク開発プロセスにおいて非常に役立ち、将来的にはゆっくりと記録される予定です。

まずエラーコード定義クラスのAnnotationを定義します。

package errorAno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ErrorDefineClass {
    String value() default "error message description";
}

このエラー コード定義クラスの Annotation の ElementType.TYPE は、クラスまたはインターフェイスに作用できることを意味します。クリックすると詳細が表示されます。さまざまなタイプにはさまざまな用途があります。

次に、エラー コード属性のアノテーションを定義します。

package errorAno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ErrorDefinition {
    String value();
}

このエラー コード属性の Annotation の ElementType.FIELD は、それがクラス属性に作用する注釈であることを表します。

次に、エラー コード クラスの読み込みおよび解析クラスを定義するか、エラー コード管理用のグローバル コンテキストを構築します。

package errorAno;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

public class ErrorContext {

    public final static int SUCCESS = 0;

    static private Map<Integer, String> errorMap;

    static {
        errorMap = new HashMap<Integer, String>();
        ErrorContext.errorMap.put(0, "Business successed!");
    }

    /*
     *return the preloaded error message without exception
     */
    public static String errnoExplain(int errno) {
        String explain = errorMap.get(errno);
        String backup = String.valueOf(errno);
        return explain != null ? explain : backup;
    }

    /*
     *return unloaded error message without exception
     */
    public static String errnoExplain(int errno, String explain) {
        if (errorMap.containsKey(errno)) {
            return errorMap.get(errno);
        } else {
            String backup = String.valueOf(errno);
            return explain != null ? explain : backup;
        }
    }

    /*
    * analyzed the error class and load them in to memory
    * */
    protected static void proxyExplain(Class<? extends ErrorContext> define) {
        //make sure the error def class extends ErrorContext
        if (define != null && define != ErrorContext.class) {
            final String dname = define.getName();
            //make sure the error class is Annotated by ErrorDefineClass
            if (define.isAnnotationPresent(ErrorDefineClass.class)) {
                Class<ErrorDefinition> defClazz = ErrorDefinition.class;
                //analyze the error fields
                for (Field field : define.getDeclaredFields()) {
                    //make sure the fields is Annotated by ErrorDefinition
                    if (field.isAnnotationPresent(defClazz)) {
                        //make sure the fields is modified by public
                        if (Modifier.isPublic(field.getModifiers())) {
                            try {
                                ErrorDefinition entry = null;
                                int errno = field.getInt(null);
                                entry = field.getAnnotation(defClazz);
                                ErrorContext.errorMap.put(errno, entry.value());
                                System.out.println("analyzed error message successed:" + entry.value());
                            } catch (Exception e) {
                                System.out.println("analyze error message exception");
                            }
                        }
                    }
                }
            }
        }
    }
}

詳細については、コード内のコメントを参照してください。主な機能は、システムの起動時にすべてのエラー コード定義のクラスと属性をロードし、使用時に直接呼び出して対応するエラー コードを見つけることです。

最後に、それをシステムに統合する方法を見てみましょう。

package errorAno;

@ErrorDefineClass
public class BusinessError extends ErrorContext{

    /*
    * preload this error Class when system is startup
    * */
    static {
        ErrorContext.proxyExplain(BusinessError.class);
    }

    @ErrorDefinition("The action code is incorrect")
    final public static int ERR_ACTION_CODE = 1;

    @ErrorDefinition("The parameters is incorrect")
    final public static int ERR_PARAMETER = 2;


    public static void main(String[] args) {
        System.out.println(ErrorContext.SUCCESS);
        System.out.println(ErrorContext.errnoExplain(1));
        System.out.println(ErrorContext.errnoExplain(2));
    }
}

これは、システムで定義する必要があるエラー コード クラスです。このクラスは、システムの起動時に自動的に読み込まれます。この種の Annotation の使用方法では、マップやさまざまなデータ構造を周期的に読み込む以前の操作は必要ありません。注釈標準に準拠しており、システムは必要なコンテンツを自動的にロードします。 テスト結果を見てみましょう

エラー コードの管理はデータベースまたはプロパティで行うことができます。良いものと悪いものの区別はありませんが、さまざまなシステムや使用シナリオに応じて異なる選択が行われます。参照用に Annotation の使用を定義します。


发表回复

Thanks for your support to bet365fans!