Java正则表达式的模式应该编译为静态数据成员还是实例变量?

PST*_*PST 5 java regex

我有一个实用程序类,其中包含所有静态方法,其中一个方法需要正则表达式匹配。

将模式声明为类的静态数据成员是好习惯还是将其声明为使用该模式的方法的实例变量是否可以?同一类的多个方法不会使用此模式。虽然这个实用方法可以被多个线程调用。

public final class Utility {
   public static someMethod(Sting in) {
      Pattern p = Pattern.compile("some pattern expression");
      Matcher m = p.matcher(in);
      if (m.matches()) {
         //do something
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

或者下面的方法更好?

public final class Utility {
   private static final Pattern p = Pattern.compile("some pattern expression");
   public static someMethod(Sting in) {
      Matcher m = p.matcher(in);
      if (m.matches()) {
         //do something
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

Ray*_*Ray 5

来自Pattern 类的Javadoc :

此类的实例是不可变的,并且可供多个并发线程安全使用。Matcher 类的实例对于此类使用并不安全。

所以第二个版本是可能的。如果您认为“更好”,请自行决定;从多线程的角度来看它是安全的。

  • 在我使用简单的正则表达式运行的测试中,重用模式的运行速度提高了 4 倍。当然是 YMMV,但如果在紧密循环中重复使用,静态模式可以产生巨大的好处。 (2认同)

Ale*_*ker 0

您需要确定在 Utility 类中使​​用该模式的位置和频率。

如果它是一个正则表达式,您仅需要一种特定方法,并且不会在其他任何地方(在可预见的将来)再次使用它,那么将其声明为该方法中的实例变量。

另一方面,如果它是一个非常可重用的正则表达式(例如电子邮件模式),请考虑将其设为静态字段。然后您的所有实用方法都可以访问它。

  • “如果它是一个正则表达式,您只需要一种特定方法,并且不会在其他任何地方再次使用它”,这是一个错误的标准。即使只有一个方法,如果该方法被重复调用数千或数百万次,那么将其设为静态也是一个好主意。 (4认同)