Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建全局变量或在函数内部创建实例_Java_Spring_Class_Oop_Object - Fatal编程技术网

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

Java 创建全局变量或在函数内部创建实例,java,spring,class,oop,object,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 = patt

这不是编码问题,而是与编码概念有关。我有一个带有一些方法的服务类,这个类还有下面两个用于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-正如您所看到的,这两种方法都有共同的代码,创建模式和匹配器实例。我应该在类的开头创建它们的实例作为全局变量吗?如果是,原因是什么?它的优势是什么

2-如果出现错误,我不确定哪一个更好;在第二个方法中抛出异常,或者只记录错误并继续第一个方法中的操作

因此,有什么最佳实践吗?
提前感谢。

无论是实例还是静态,您的模式实例都很好。游行者不是线程安全的,所以在哪里创建它们很重要。如果类在单个线程上运行,那么实例就可以了。如果您将这个类作为单例使用,那么在共享模式之外的每个方法中创建一个新的marcher。查看一下

无论是实例还是静态,您的模式实例都很好。游行者不是线程安全的,所以在哪里创建它们很重要。如果类在单个线程上运行,那么实例就可以了。如果您将这个类作为单例使用,那么在共享模式之外的每个方法中创建一个新的marcher。看一看

您实际上发现了一种提高代码速度的好方法。这也是在执行缓慢的正则表达式时常见的问题。由于模式是线程安全的,所以可以一次性实例化它,并在后续的方法调用中重用它

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类不是线程安全的


关于第二点:问自己以下问题:此操作的结果对调用方重要吗?如果回答是“是”,则抛出某种异常,以指示出现了什么问题。如果没有,您可以记录错误以支持以后的调试。

您实际上发现了一种提高代码速度的好方法。这也是在执行缓慢的正则表达式时常见的问题。由于模式是线程安全的,所以可以一次性实例化它,并在后续的方法调用中重用它

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类不是线程安全的

关于第二点:问自己以下问题:此操作的结果对调用方重要吗?如果回答是“是”,则抛出某种异常,以指示出现了什么问题。如果没有,您可以记录错误以支持以后的调试

您的模式基于特定的正则表达式,这并不是说您只有一个正则表达式。因此,您最好在需要时获得模式。再次,来到Matcher,它是基于您的模式。因此,您已经根据需要创建了它。 如果URL只有一个正则表达式可供检查,那么将它们设置为类级变量是有意义的。 对于错误-通常,您抛出一个异常抛出异常-第二种情况是,当您希望调用方API处理异常场景时。假设有两个parseUrlDomain调用方,这些调用方希望以不同的方式处理URL解析异常,那么使用throws子句更有意义。 另一方面,当您非常清楚如何处理错误或异常情况时,通常会捕获、记录。代码段中的第一个案例。 您的模式基于特定的正则表达式,这并不是说您只有一个正则表达式。因此,您最好在需要时获得模式。再次,来到Matcher,它是基于您的模式。因此,您已经根据需要创建了它。 如果URL只有一个正则表达式可供检查,那么将它们设置为类级变量是有意义的。 对于错误-通常,您抛出一个异常抛出异常-第二种情况是,当您希望调用方API处理异常场景时。假设有两个parseUrlDomain调用方,这些调用方希望以不同的方式处理URL解析异常,那么使用throws子句更有意义。 另一方面,当您非常清楚如何处理错误或异常情况时,通常会捕获、记录。代码段中的第一个案例。
如果它们不变,为什么不将它们声明为常量,作为私有静态最终字符串?甚至是对术语的枚举更正。第1点:它们不是全局变量。如果它们特定于对象的实例,则它们是实例变量。如果它们在类的所有实例中共享,那么它们将是静态变量。如果它们不变,为什么不将它们声明为常量,作为私有静态最终字符串?甚至是对术语的枚举更正。第1点:它们不是全局变量。如果它们特定于对象的实例,则它们是实例变量。如果它们在类的所有实例中共享,则它们将是静态变量;我将只在这个类中使用这个正则表达式字符串和模式,那么声明它的原因是什么呢
静止的而且regex在两种方法中是不同的,所以我需要在类的开头声明两个不同的模式实例吗?看看Java中的static关键字:静态实例变量在同一类的对象之间共享。类中可以有1000个对象,但仍然只有一个模式实例。因为它是线程安全的,所以可以在不同的线程中使用。是的,如果正则表达式不同,你必须创建两个模式对象。我只会使用这些正则表达式一次,所以我需要将它们设置为静态吗?或者只是创建私人最终。你只使用一次是什么意思;我将只在这个类中使用这个正则表达式字符串和模式,那么声明它为静态的原因是什么呢?而且regex在两种方法中是不同的,所以我需要在类的开头声明两个不同的模式实例吗?看看Java中的static关键字:静态实例变量在同一类的对象之间共享。类中可以有1000个对象,但仍然只有一个模式实例。因为它是线程安全的,所以可以在不同的线程中使用。是的,如果正则表达式不同,你必须创建两个模式对象。我只会使用这些正则表达式一次,所以我需要将它们设置为静态吗?或者只是创建私人最终。你们只使用它们一次是什么意思?我有两个不同的正则表达式,所以在示例中的方法中分别创建模式合乎逻辑吗?或者我应该在类的开头创建两个不同的模式实例吗?在类级别创建它们。我有两个不同的正则表达式,所以像示例中那样在方法中分别创建模式合乎逻辑吗?或者我应该在类的开头创建两个不同的模式实例吗?在类级别创建它们。