Java 정규식 패턴-시간 상수 또는 인스턴스 멤버를 컴파일 하시겠습니까?


13

현재 정규 표현식에서 일치 하는 두 개의 싱글 톤 객체가 있으며 내 객체 Pattern는 다음과 같이 정의됩니다.

class Foobar {
  private final Pattern firstPattern =
    Pattern.compile("some regex");
  private final Pattern secondPattern =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

그러나 나는 다른 날 누군가에게 이것이 나쁜 스타일이라고 들었고, 항상 클래스 수준에서 정의 Pattern되어야하며 대신 다음과 같이 보입니다.

class Foobar {
  private static final Pattern FIRST_PATTERN =
    Pattern.compile("some regex");
  private static final Pattern SECOND_PATTERN =
    Pattern.compile("some other regex");
  // more Patterns, etc.
  private Foobar() {}
  public static Foobar create() { /* singleton stuff */ }
}

이 특정 객체의 수명은 그리 길지 않으며 첫 번째 접근 방식을 사용하는 주된 이유 Pattern는 객체가 GC에 도달 하면 s 를 붙잡는 것이 의미가 없기 때문 입니다.

어떤 제안 / 생각?

답변:


18

Java Pattern 객체는 스레드로부터 안전하며 불변입니다 (스레드 안전하지 않은 일치 자).

따라서 클래스의 각 인스턴스에서 사용되거나 클래스의 다른 메소드에서 다시 사용되는 경우에는 작성 하지 않을 이유가 없습니다 static.

수명이 얼마나 짧거나 길든 인스턴스 변수를 만들면 클래스의 인스턴스를 만들 때마다 정규 표현식을 다시 컴파일한다는 의미입니다.

이 구조의 주요 이유 중 하나 (패턴이 Matcher 객체의 팩토리 임)는 정규식을 유한 한 오토마타로 컴파일 하는 것이 적당히 비싼 작업이라는 것입니다. 그러나 주어진 클래스에서 동일한 정규 표현식이 반복해서 사용되는 경우가 종종 있습니다 (동일한 메소드를 여러 번 호출하거나 클래스의 다른 지점을 통해).

반면에 Matcher는 다소 가볍습니다. Pattern 내의 패턴 상태와 문자열의 문자 배열 내 위치를 가리 킵니다.


A의 싱글 , 그건 문제가 안 너무 많이 있기 때문에 모든 후, '긴 것이 아니다 싱글의 일생'(대기, 주위에 앉아 다시 다시 싱글을 다시되지 않은 그것의 하나 개의 인스턴스 만있다 ?이 무슨 뜻 하는 응용 프로그램의 과정을 통해 그것을 여러 번 인스턴스화?)

그러나 일부 정적 소스 코드 분석기는 무언가가 단일 항목임을 인식하지 못하고 클래스의 각 인스턴스에 대해 상수에서 패턴 인스턴스를 작성하고 있다고 불평합니다.

이 모든 것의 문제는 그것이 좋지 않다는 것 (단일도 나쁘지 않은 선택)이며 컴파일러와 분석 도구가 알려주는 것들에 대한 다른 경고를 무시할 수 있다는 것입니다 ( 깨진 창 에 대해 더 읽으십시오 ).

관련 :


굉장한 대답-예, 나는 그것이 한 번만 만들어지고 사용되었다는 것을 의미했으며, 범위를 벗어나면 잘되었습니다. 후속 조치를 읽어 주셔서 감사합니다!
yamafontes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.