8

エラー メッセージなどを 1 つのファイルにまとめて、可能であればコードを読みやすくしたいと考えています。

列挙型ファイルにあるものの例を次に示します。

public enum ZipErrorType {

// START: define exception messages (alphabetical order)
EMPTY_FILE_NAME_IN_LIST {
    public String toString() {
        return "One or more null/empty filename(s) found";
    }
},

FILE_DOESNT_EXIST {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] does not exist";
    }
},

FILE_LIST_IS_NULL {
    public String toString() {
        return "File list is null/empty";
    }
},

FILENAME_NOT_ABSOLUTE {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] is not absolute";
    }
},

MUST_BE_DIR {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] must be a directory";
    }
},

MUST_BE_FILE {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] must be a file";
    }
},

NULL_OR_EMPTY {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] is null/empty";
    }
},

OUTPUT_FILE_ALREADY_EXISTS {
    public String who(String sThisFile) {
        return "[" + sThisFile + "] already exists";
    }
},

OUTPUT_FILENAME_EMPTY {
    public String toString() {
        return "Output filename is null/empty";
    }
},

OUTPUT_PATH_EMPTY {
    public String toString() {
        return "Output path is null/empty";
    }
},
// END: define exception messages

NONE {};

public String who(String sThisFile) { return ""; }
}

次に、私のプログラムには次のようなコードがあります。

private static ZipErrorType getFileErrorsIfAny(String sFilename, boolean shouldBeFile) {

    // check if given filename is absolute
    File file = new File(sFilename);
    if (!file.isAbsolute()) {
        return ZipErrorType.FILENAME_NOT_ABSOLUTE;
    }

    // check if file exists
    if (!file.exists()) {
        return ZipErrorType.FILE_DOESNT_EXIST;
    }

    // check if corresponding file is a file when it shouldn't be...
    if (file.isFile() && !shouldBeFile) {
        return ZipErrorType.MUST_BE_DIR;
    }
    // ...or a directory when it should be a file
    else if (file.isDirectory() && shouldBeFile) {
        return ZipErrorType.MUST_BE_FILE;
    }

    return ZipErrorType.NONE;
}

...そして、列挙型をどのように利用するかの例:

    // check input files
    for (String sFile : files) {
        if (sFile == null || sFile.trim().length() == 0) {
            throw new NullPointerException("One or more filename is null/empty");
        }

        errorIfAny = getFileErrorsIfAny(sFile.trim(), true); 
        if (!errorIfAny.equals(ZipErrorType.NONE)) {
            throw new ZipInputException(errorIfAny.who(sFile.trim()));
        }
    }

これらのコードだけで判断するのは難しいと思いますが、一般的な観点から見て大丈夫ですか?私がやっていることは面倒なことではありませんか?これを改善する方法はありますか?

4

2 に答える 2

5

エラー メッセージを作成するには、列挙型の代わりに単純な文字列テンプレートを使用することをお勧めします。このようなもの:

String EMPTY_FILE_NAME_IN_LIST_TEMPLATE = "One or more null/empty filename(s) found";
String FILE_DOESNT_EXIST_TEMPLATE = "[ %s ] does not exist";
String FILE_LIST_IS_NULL_TEMPLATE = "File list is null/empty";
String FILENAME_NOT_ABSOLUTE_TEMPLATE = "[ %s ] is not absolute";
String MUST_BE_DIR_TEMPLATE = "[ %s ] must be a directory";
String MUST_BE_FILE_TEMPLATE = "[ %s ] must be a file";
String NULL_OR_EMPTY_TEMPLATE = "[ %s ] is null/empty";
String OUTPUT_FILE_ALREADY_EXISTS_TEMPLATE = "[ %s ] already exists";
String OUTPUT_FILENAME_EMPTY_TEMPLATE = "Output filename is null/empty";
String OUTPUT_PATH_EMPTY_TEMPLATE = "Output path is null/empty";

そして、String.format(template, sFilename)実際のメッセージを構築するために使用します。

getFileErrorsIfAny()メソッドから直接例外をスローすることも検討できます。

File file = new File(sFilename);
if (!file.isAbsolute()) {
    throw new ZipInputException(String.format(FILENAME_NOT_ABSOLUTE_TEMPLATE, sFilename));
}

私にはよりクリーンでコンパクトに見えます。

于 2013-04-15T08:22:01.420 に答える
1

これにより、コードの周りに多数の大量enumの s が点在する可能性があるようです。

ログ メッセージをログ ステートメントから分離したいと考えたのは、これが初めてではありません。

実際、ローカリゼーション用に設計されたこのためのフレームワークがjava.util.loggingすでにあります。

.propertiesメッセージを含むファイルを使用します。
クラスパス内のファイルへのパスでロガーを取得します: -

Logger logger = Logger.getLogger("com.example", "path/to/messages.properties");

ログ ステートメントは、プロパティ キーを使用して実行されます。

logger.log(level, "messageKey");

MessageFormatまた、構文を使用するため、ロギングをパラメーター化できます

zip.fileDoesNotExist={0} does not exist

logger.log(level, "zip.fileDoesNotExist", file);

これらのパラメーターは、フォーマット情報を指定したりChoiceFormat、必要に応じて使用したりできるため、非常に柔軟です。

これらすべての主な利点は、メッセージがclass. また、ファイルを使用してログのオンとオフを自由に切り替えることができlogging.propertiesます。単一のクラスのログのオンとオフを切り替えることもできます。また、複数のファイルやコンソールにログを記録したり、エラーに関するメールを送信したりできます。

では、結論として。既存のロギング フレームワークを使用します。自分で巻かないでください。

免責事項: JUL は Java に組み込まれているため、JUL についてのみ説明します。サードパーティのライブラリは必要ありません。他にもたくさんのフレームワークがあります。

于 2013-04-15T07:45:06.433 に答える