Java 创建全局变量或在函数内部创建实例
这不是编码问题,而是与编码概念有关。我有一个带有一些方法的服务类,这个类还有下面两个用于url解析和验证过程的私有方法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
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个对象,但仍然只有一个模式实例。因为它是线程安全的,所以可以在不同的线程中使用。是的,如果正则表达式不同,你必须创建两个模式对象。我只会使用这些正则表达式一次,所以我需要将它们设置为静态吗?或者只是创建私人最终。你们只使用它们一次是什么意思?我有两个不同的正则表达式,所以在示例中的方法中分别创建模式合乎逻辑吗?或者我应该在类的开头创建两个不同的模式实例吗?在类级别创建它们。我有两个不同的正则表达式,所以像示例中那样在方法中分别创建模式合乎逻辑吗?或者我应该在类的开头创建两个不同的模式实例吗?在类级别创建它们。