我想将我的错误消息和内容合并到一个文件中,并尽可能使我的代码更具可读性。
以下是我在枚举文件中的示例:
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()));
}
}
现在我知道单凭这些代码片段很难判断,但从一般的角度来看,这是否正常?我正在做什么不值得的麻烦,有没有办法改善这个?
答案 0 :(得分:4)
我建议使用简单的字符串模板而不是枚举来构建错误消息。 像这样:
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));
}
对我来说看起来更干净,更紧凑。
答案 1 :(得分:1)
这似乎有可能导致许多大量enum
点缀在代码周围。
这不是第一次有人想要将日志消息与日志语句分开。
事实上java.util.logging
已经有framework for this专为本地化而设计。
它使用包含消息的.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中的 - 你不需要任何第三方库,那里有很多很多其他框架。