这不是编码问题,而是与编码概念有关。我有一个带有一些方法的服务类,并且该类具有以下两个用于URL解析和验证过程的私有方法。
private boolean isUrlFormatValid(String url) {
Pattern pattern = Pattern.compile("^(https?:\\/\\/)?(www\\.)?([\\w]+\\.)+[\u200C\u200B\\w]{2,63}\\/?$");
Matcher matcher = pattern.matcher(url);
if (matcher.matches()) {
return true;
} else {
LOG.error("Url format is not valid");
return false;
}
}
private String parseUrlDomain(String url) throws Exception {
Pattern p = Pattern.compile("^(?:https?:\\/\\/)?(?:www\\.)?((?:[\\w]+\\.)+\\w+)");
Matcher m = p.matcher(url);
if (m.matches()) {
System.out.println(m.group(1));
return m.group(1);
}
throw new Exception("Url domain is not parsed ");
}
这些代码运行良好,但是我不确定某些要点:
1-如您所见,这两种方法都有通用的代码,它们创建 pattern 和 matcher 实例。我应该在课程开始时将其实例创建为全局变量吗?如果是这样,它的原因是什么,它的优点是什么。
2-如果发生错误,我不确定哪一个更好;像第二种方法一样引发异常,或者只是记录错误并按第一种方法继续操作。
因此,有什么最佳实践吗? 预先感谢。
答案 0 :(得分:2)
您的Pattern实例可以是实例也可以是静态的。行军者不是线程安全的,因此创建它们的位置很重要。如果您的类在单个线程上运行,那么实例就可以了。如果您将此类作为单例使用,请在共享模式的每种方法中创建一个新的行进器。看看this question
答案 1 :(得分:1)
您实际上发现了一种使代码更快的好方法。当正则表达式执行缓慢时,这也是一个普遍的问题。由于Pattern
是线程安全的,因此您可以实例化它一次,以便在后续方法调用中重复使用它。
private static final String REGEX = "some_regex";
private static final Pattern PATTERN = Pattern.compile(REGEX);
private boolean testRegex(String s) {
return PATTERN.matcher(s).matches();
}
请注意,Matcher
类不是线程安全的。
第二点:问自己以下问题:此操作的结果对呼叫者重要吗?如果答案是肯定的,则抛出某种异常以指示出了什么问题。如果没有,您可以记录该错误以支持以后的调试。
答案 2 :(得分:1)