[java] Java에 String.Empty가없는 이유는 무엇입니까?

문자열 리터럴을 입력 할 때마다 ""문자열 풀에서 동일한 String 객체가 참조 된다는 것을 이해합니다 .

그러나 String API에 왜을 포함하지 않으므로에 대한 public static final String Empty = "";참조를 사용할 수 String.Empty있습니까?

컴파일러는 기존 문자열을 참조하고 이미 재사용을 위해 이미 생성되었는지 확인할 필요가 없으므로 컴파일 시간을 절약 할 수 있습니다. 그리고 개인적으로 문자열 리터럴, 특히 작은 것의 확산은 많은 경우 “코드 냄새”라고 생각합니다.

String.Empty 뒤에 그랜드 디자인 이유가 있었습니까? 아니면 언어 작성자가 단순히 내 견해를 공유하지 않았습니까?



답변

String.EMPTY12 자이고 ""2 자이며 둘 다 런타임시 메모리에서 정확히 동일한 인스턴스를 참조합니다. 왜 String.EMPTY컴파일 시간을 절약 할 수 있을지 잘 모르겠습니다 . 실제로 후자라고 생각합니다.

특히 고려 String의는 불변, 당신이 먼저 빈 문자열을 얻고, 거기에 몇 가지 작업을 수행 할 수 있습니다처럼 아니에요 – 최고의을 사용하는 StringBuilder(또는 StringBuffer과 문자열로 그 차례는 스레드 안전 할 경우).


의견에서 질문으로 업데이트 :

이것이 실제로 영감을 준 것은
TextBox.setText("");

적절한 수업에 상수를 제공하는 것이 합법적이라고 생각합니다.

private static final String EMPTY_STRING = "";

그런 다음 코드에서와 같이

TextBox.setText(EMPTY_STRING);

이런 식으로 IDE 또는 기타 비슷한 문자열을 채우는 것을 잊어 버린 것보다 빈 문자열을 원한다는 것이 분명합니다.


답변

사용하다 org.apache.commons.lang.StringUtils.EMPTY


답변

null 값에 대해 걱정하지 않고 빈 문자열과 비교하려면 다음을 수행하십시오.

if ("".equals(text))

궁극적으로 당신은 당신이 믿는 것을 가장 분명하게해야합니다. 대부분의 프로그래머는 “”는 빈 문자열을 의미하며 누군가가 입력하지 않은 문자열을 의미한다고 가정합니다.

성능 이점이 있다고 생각되면 테스트해야합니다. 자신의 테스트 가치가 없다고 생각한다면 실제로 가치가 없다는 좋은 증거입니다.

15 년 전에 언어가 설계되었을 때 해결 된 문제를 해결하려고하는 것 같습니다.


답변

실제로 String.EMPTY 상수를 원하면 프로젝트에서 “Constants”라는 유틸리티 정적 최종 클래스를 만들 수 있습니다. 이 클래스는 빈 문자열을 포함하여 상수를 유지합니다.

같은 생각으로 Integer 클래스에는 존재하지 않는 ZERO, ONE int 상수를 만들 수 있지만, 내가 언급했듯이 쓰기와 읽기가 어려울 것입니다.

for(int i=Constants.ZERO; ...) {
    if(myArray.length > Constants.ONE) {
        System.out.println("More than one element");
    }
}

기타.


답변

Apache StringUtils도이 문제를 해결합니다.

다른 옵션의 실패 :

  • isEmpty ()-null 안전하지 않습니다. 문자열이 null이면 NPE를 throw합니다.
  • length () == 0-다시 null 안전하지 않습니다. 공백 문자열도 고려하지 않습니다.
  • EMPTY 상수와의 비교-null 안전하지 않을 수 있습니다. 공백 문제

Granted StringUtils는 드래그하는 또 다른 라이브러리이지만 잘 작동하고 많은 시간을 절약하고 Null을 확인하거나 NPE를 정상적으로 처리하는 번거 로움을 덜어줍니다.


답변

“문자열의 메모리 풀은 리터럴 형태로 재사용되며 대소 ​​문자는 닫힙니다”라고 말하지 마십시오. 컴파일러가 후드 아래에서하는 일은 여기가 아닙니다. 이 질문은 합리적으로 이루어졌으며 특히받은 많은 투표권이 주어졌습니다.

그것은 API에 대한 인간의 사용이 어렵 기 때문에 대칭 에 관한 것 입니다. 초기 Java SDK는이 규칙을 무시한 것으로 악명 높았지만 이제는 너무 늦었습니다. 내 머리 위에 몇 가지 예가 있습니다. “좋아하는”예를 자유롭게 들으십시오.

  • BigDecimal.ZERO이지만 AbstractCollection.EMPTY, String.EMPTY는 없습니다.
  • Array.length이지만 List.size ()
  • List.add (), Set.add ()이지만 Map.put (), ByteBuffer.put () 및 StringBuilder.append (), Stack.push ()를 잊지 말자

답변

모든 ""리터럴은 동일한 객체입니다. 왜 그렇게 복잡해 지나요? 타이핑하는 것이 길고 명확하지 않습니다 (컴파일러 비용은 최소입니다). Java의 문자열은 변경 불가능한 객체이므로 효율성을 제외하고는 구분할 필요가 없지만 빈 문자열 리터럴을 사용하면 크게 중요하지 않습니다.

정말로 EmptyString상수를 원한다면 스스로 만드십시오. 그러나 더 많은 코드를 장려하기 만하면됩니다. 그렇게 하면 아무런 이점 이 없습니다 .