Java에 String.Empty가없는 이유는 무엇입니까?
문자열 리터럴을 입력 할 때마다 ""
문자열 풀에서 동일한 문자열 객체가 참조 된다는 것을 이해합니다 .
그러나 String API에 왜을 포함하지 않으므로에 대한 public static final String Empty = "";
참조를 사용할 수 String.Empty
있습니까?
컴파일러는 기존 문자열을 참조하고 이미 재사용을 위해 이미 생성되었는지 확인할 필요가 없으므로 컴파일 시간을 절약 할 수 있습니다. 그리고 개인적으로 나는 문자열 리터럴, 특히 작은 것의 확산이 많은 경우에 "코드 냄새"라고 생각합니다.
String.Empty 뒤에 그랜드 디자인 이유가 있었습니까? 아니면 언어 작성자가 단순히 내 견해를 공유하지 않았습니까?
String.EMPTY
12 자이고 ""
2 자이며 둘 다 런타임시 메모리에서 정확히 동일한 인스턴스를 참조합니다. String.EMPTY
컴파일 시간을 절약 할 수있는 이유 가 확실하지 않습니다 . 사실 후자가 될 것입니다.
특히 String
s를 변경할 수 없다는 점을 고려 하면 먼저 빈 문자열을 가져 와서 일부 작업을 수행하는 것과는 다릅니다. 가장 사용 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 년 전에 언어가 설계되었을 때 해결 된 문제를 해결하려고하는 것 같습니다.
Apache StringUtils도이 문제를 해결합니다.
다른 옵션의 실패 :
- isEmpty ()-null 안전하지 않습니다. 문자열이 null이면 NPE를 throw합니다.
- length () == 0-다시 null 안전하지 않습니다. 공백 문자열도 고려하지 않습니다.
- EMPTY 상수와의 비교-null 안전하지 않을 수 있습니다. 공백 문제
Granted StringUtils는 드래그하는 또 다른 라이브러리이지만 잘 작동하고 많은 시간을 절약하고 Null을 확인하거나 NPE를 정상적으로 처리하는 번거 로움을 덜어줍니다.
실제로 String.EMPTY 상수를 원하면 프로젝트에서 "Constants"라는 유틸리티 정적 최종 클래스를 만들 수 있습니다. 이 클래스는 빈 문자열을 포함하여 상수를 유지합니다.
같은 생각으로 Integer 클래스에는 존재하지 않는 ZERO, ONE int 상수를 만들 수 있지만, 내가 언급했듯이 쓰기와 읽기가 어려울 것입니다.
for(int i=Constants.ZERO; ...) {
if(myArray.length > Constants.ONE) {
System.out.println("More than one element");
}
}
기타.
모든 ""
리터럴은 동일한 객체입니다. 왜 그렇게 복잡해 지나요? 타이핑하는 것이 길고 명확하지 않습니다 (컴파일러 비용은 최소입니다). Java의 문자열은 변경 불가능한 객체이므로 효율성을 제외하고는 구분할 필요가 없지만 빈 문자열 리터럴을 사용하면 별다른 문제가 없습니다.
정말로 EmptyString
상수를 원한다면 스스로 만드십시오. 그러나 더 많은 코드를 장려하기 만하면됩니다. 그렇게 하면 아무런 이점 이 없습니다 .
"문자열의 메모리 풀은 리터럴 형태로 재사용되며, 대소 문자가 닫힙니다"라고 말하지 마십시오. 컴파일러가 후드 아래에서하는 일은 여기가 아닙니다. 이 질문은 특히받은 투표 수를 감안할 때 합리적입니다.
그것은 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 ()를 잊지 말자
Noel M이 말한 것을 더하기 위해이 질문을 볼 수 있으며이 대답은 상수가 재사용되었음을 보여줍니다.
http://forums.java.net/jive/message.jspa?messageID=17122
문자열 상수는 항상 "인터 닝"되므로 실제로 그러한 상수가 필요하지 않습니다.
String s=""; String t=""; boolean b=s==t; // true
String 리터럴 ""을 입력 할 때마다 동일한 String 객체가 String 풀에서 참조됨을 이해합니다.
그러한 보증은 없습니다. 그리고 당신은 당신의 응용 프로그램에서 그것에 의존 할 수 없으며, 결정하는 것은 완전히 jvm에 달려 있습니다.
아니면 언어 제작자가 단순히 내 의견을 공유하지 않았습니까?
네. 나에게는 우선 순위가 매우 낮은 것 같습니다.
주장 ""
하고 String.Empty
상호 교환이 가능하거나 ""
더 나은 사람들에게는 매우 잘못되었습니다.
당신이 할 때마다 myVariable = ""; 오브젝트의 인스턴스를 작성 중입니다. Java의 String 오브젝트에 EMPTY 공용 상수가있는 경우 오브젝트 ""의 인스턴스는 1 개만 있습니다.
예 :-
String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax
myVar0 = String.EMPTY;
myVar1 = String.EMPTY;
myVar2 = String.EMPTY;
myVar3 = String.EMPTY;
myVar4 = String.EMPTY;
myVar5 = String.EMPTY;
myVar6 = String.EMPTY;
myVar7 = String.EMPTY;
myVar8 = String.EMPTY;
myVar9 = String.EMPTY;
10 (String.EMPTY를 포함하여 11 개) 1 개의 객체를 가리키는 포인터
또는 :-
myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";
10 개의 객체를 가리키는 10 개의 포인터
이는 비효율적이며 대규모 응용 프로그램 전체에서 중요 할 수 있습니다.
Java 컴파일러 또는 런타임은 ""의 모든 인스턴스를 자동으로 동일한 인스턴스를 가리 키도록 충분히 효율적일 수 있지만 그러한 결정을 내리는 데 추가 처리가 필요하지 않을 수도 있습니다.
참고 URL : https://stackoverflow.com/questions/3450604/why-is-there-no-string-empty-in-java
'Programing' 카테고리의 다른 글
홈브류, 맥 포트 또는 기타 패키지 설치 도구의 차이점 / 사용은 무엇입니까? (0) | 2020.04.14 |
---|---|
선택적인 용도 (0) | 2020.04.14 |
HTML 속성 내에서 따옴표를 올바르게 이스케이프 처리하려면 어떻게해야합니까? (0) | 2020.04.14 |
백그라운드 작업, 진행률 대화 상자, 방향 변경-100 % 작동하는 솔루션이 있습니까? (0) | 2020.04.14 |
std :: unique_ptr입니까 (0) | 2020.04.14 |