创建全局变量或在函数内部创建实例

时间:2018-12-17 11:43:45

标签: java spring class oop object

这不是编码问题,而是与编码概念有关。我有一个带有一些方法的服务类,并且该类具有以下两个用于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-如果发生错误,我不确定哪一个更好;像第二种方法一样引发异常,或者只是记录错误并按第一种方法继续操作。

因此,有什么最佳实践吗? 预先感谢。

3 个答案:

答案 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)

  1. 您的模式基于特定的正则表达式,而不是您只有一个正则表达式。因此,最好在需要时获取模式。同样,来到Matcher,它是基于您的模式的。因此,您已根据需要创建了它。 如果您只有一个正则表达式供您检查URL,则将它们设为类级别变量将很有意义。
  2. 对于错误-通常,当您希望调用方API处理异常情况时,会引发异常(引发Exception-第二种情况)。假设有两个 parseUrlDomain 调用方,并且这些调用方希望以不同的方式处理URL解析异常,那么更有意义的是使用throws子句。 另一方面,当您非常清楚如何处理错误或异常情况时,通常会捕获日志。 (您的代码段中的第一种情况)。