programing

왜 String이 없어요?Java에서는 비어있습니까?

luckcodes 2022. 9. 12. 18:43

왜 String이 없어요?Java에서는 비어있습니까?

스트링 리터럴을 입력할 때마다""문자열 풀에서 동일한 String 개체가 참조됩니다.

그런데 왜 String API에는 다음 명령어가 포함되어 있지 않은가?public static final String Empty = "";에 대한 참조를 사용할 수 있습니다.String.Empty?

컴파일러가 기존 String을 참조하는 것을 알고 재사용을 위해 이미 작성되었는지 확인할 필요가 없기 때문에 컴파일 시간을 최소한 절약할 수 있습니다.그리고 개인적으로 현악기, 특히 작은 것의 확산은 많은 경우에 "코드 냄새"라고 생각한다.

그럼 끈이 없는 배경에는 위대한 디자인 이유가 있었던 거군요.공허한가, 아니면 단순히 언어 창조자들이 내 견해를 공유하지 않은가?

String.EMPTY12글자입니다.""둘 다 실행 시 메모리의 동일한 인스턴스를 참조합니다.이유는 잘 모르겠습니다.String.EMPTY컴파일 시간을 절약할 수 있습니다.사실 후자가 될 것 같아요.

특히나,Strings는 불변합니다.처음 빈 스트링을 취득하여 그 스트링에 대해 몇 가지 조작을 실행할 수 있는 것은 아닙니다.StringBuilder(또는StringBuffer스레드 세이프가 필요한 경우)를 스트링으로 변환합니다.

갱신하다
코멘트부터 질문까지:

이게 영감을 준 건 사실TextBox.setText("");

적절한 클래스에 상수를 제공하는 것은 전적으로 정당하다고 생각합니다.

private static final String EMPTY_STRING = "";

그리고 당신의 코드에 있는 그대로를 참조해 주세요.

TextBox.setText(EMPTY_STRING);

이렇게 하면 IDE에 문자열을 입력하는 것을 잊은 것이 아니라 빈 문자열이 필요하다는 것을 명시할 수 있습니다.

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

늘 값을 신경 쓰지 않고 빈 문자열과 비교하려면 다음을 수행합니다.

if ("".equals(text))

궁극적으로 가장 명확하다고 믿는 것을 해야 한다.대부분의 프로그래머들은 ""가 빈 문자열을 의미하며, 누군가가 무언가를 넣는 것을 잊은 문자열이 아니라고 추측한다.

퍼포먼스상의 이점이 있다고 생각되는 경우는, 테스트해 주세요.스스로 시험해 볼 가치가 없다고 생각한다면, 그것은 정말로 가치가 없다는 좋은 증거입니다.

15년 전에 언어가 만들어졌을 때 해결된 문제를 해결하려는 것처럼 들리네요.

단순히 "문자열 메모리 풀은 문자 그대로 재사용됩니다. 대소문자가 종결됩니다."라고만 말하지 마십시오.컴파일러가 비밀리에 하는 일은 여기서 중요한 게 아니야그 질문은 특히 그것이 받은 상향 투표의 수를 고려할 때 타당하다.

대칭성에 관한 것입니다.이것이 없으면 API는 인간이 사용하기 어려워집니다.초기 Java SDK는 이 규칙을 무시하기로 악명 높았고 지금은 너무 늦었다.여기 제 머리 위에 몇 가지 예가 있습니다. "즐겨찾기" 예를 들어주세요.

  • Big Decimal.0이지만 Abstract Collection은 없습니다.[EMPLY], [String]
  • Array.length 단 List.size()
  • List.add(), Set.add() 그러나 Map.put(), ByteBuffer.put() 및 Stack.push()를 잊지 말자.

Apache String Utils는 이 문제도 해결합니다.

다른 옵션의 장애:

  • is Empty() - 늘 세이프가 아닙니다.문자열이 늘일 경우 NPE를 슬로우합니다.
  • length() == 0 - 다시 null safe가 아닙니다.공백 문자열도 고려하지 않습니다.
  • EMPTY 상수와 비교 - null safe가 아닐 수 있습니다.공백 문제

Granted String Utils는 드래그 할 수 있는 또 다른 라이브러리이지만 매우 잘 동작하며 NPE의 늘을 체크하거나 NPE를 정상적으로 취급하는 번거로움과 시간을 절약할 수 있습니다.

스트링을 정말 원한다면.비어 있는 상수, 프로젝트에서 "정수"라는 유틸리티 정적 최종 클래스를 만들 수 있습니다(예:).이 클래스는 빈 문자열...을 포함한 상수를 유지합니다.

같은 아이디어로 제로, ONE int 상수를 만들 수 있습니다.Integer 클래스에는 존재하지 않지만, 제가 코멘트한 것처럼, 글을 쓰고 읽는 것은 귀찮을 것입니다.

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

기타.

이게 확실한 답인 것 같아

String empty = org.apache.commons.lang.StringUtils.EMPTY;

「빈 초기화」코드에 「매직 문자열」이 없어져, 상수가 사용되기 때문에 훌륭합니다.

그 모든 것""리터럴도 같은 객체입니다.왜 이렇게 복잡해?입력 시간이 길고 선명하지 않을 뿐입니다(컴파일러 비용은 최소입니다).Java의 문자열은 불변의 객체이기 때문에 효율성 측면에서가 아니라 빈 문자열 리터럴로 구분할 필요가 없습니다.

만약 당신이 정말로 원한다면EmptyString항상, 스스로 만들어라.하지만 그것이 할 일은 훨씬 더 상세한 코드를 장려하는 것뿐이다; 그렇게 하는 것은 결코 이득이 되지 않을 것이다.

Noel M이 말한 내용에 덧붙여, 이 질문을 보면, 상수가 재이용되고 있는 것을 알 수 있습니다.

http://forums.java.net/jive/message.jspa?messageID=17122

문자열 상수는 항상 "interned"되므로 이러한 상수는 실제로 필요하지 않습니다.

String s=""; String t=""; boolean b=s==t; // true

String 리터럴을 입력할 때마다 String 풀에서 동일한 String 개체가 참조된다는 것을 알고 있습니다.
그런 보장은 없습니다.또한 애플리케이션에서 이를 신뢰할 수 없습니다. jvm의 결정에 전적으로 달려 있습니다.

아니면 단순히 언어 창작자들이 제 견해를 공유하지 않았나요?
네, 제가 보기엔 우선순위가 낮은 것 같아요

답장이 늦었지만, 이 주제에 뭔가 새로운 것을 더하는 것 같아요.

이전 답변 중 원래의 질문에 대한 답변은 없습니다.어떤 사람들은 상수 부족을 정당화하려고 시도했고, 다른 사람들은 상수 부족을 해결할 수 있는 방법을 보여주었습니다.그러나 누구도 이 상수의 이점을 위해 설득력 있는 근거를 제시하지 못했기 때문에, 그 부재는 여전히 제대로 설명되지 않고 있습니다.

상수는 특정 코드 오류가 인식되지 않도록 하기 때문에 유용합니다.

예를 들어 ""에 대한 수백 개의 참조가 있는 대규모 코드 베이스가 있다고 가정해 보십시오.코드 스크롤 중에 이 중 하나를 수정하여 "로 변경합니다.이러한 변경은, 실가동중에 눈에 띄지 않게 될 가능성이 높기 때문에, 그 원인을 검출하기 어려운 문제가 발생할 가능성이 있습니다.

OTOH는 EMTY라는 이름의 라이브러리 상수로, 동일한 오류가 발생할 경우 EM PTY와 같은 컴파일러 오류를 생성합니다.

자신의 상수를 정의하는 것이 더 좋습니다.누군가는 여전히 실수로 초기화를 변경할 수 있지만, 널리 사용되고 있기 때문에 이러한 오류의 영향은 단일 사용 사례의 오류보다 간과하기가 훨씬 어렵습니다.

이는 리터럴 값 대신 상수를 사용하면 얻을 수 있는 일반적인 이점 중 하나입니다.일반적으로 수십 곳에서 사용되는 값에 상수를 사용하면 한 곳에서 해당 값을 쉽게 업데이트할 수 있습니다.이러한 변경은 어디에서나 나타날 수 있기 때문에, 이러한 변경은 그 값이 우연히 수정되는 것을 방지한다는 것은 그다지 자주 인정되지 않습니다.따라서 ""는 EXPTY보다 짧지만 EXPTY는 ""보다 사용하기에 안전합니다.

원래 질문으로 돌아가면언어 설계자는 자주 사용되는 문자 그대로의 값에 상수를 제공하는 이점을 몰랐을 것입니다.언젠가는 Java에 문자열 상수가 추가되기를 바랍니다.

이게 얼마나 오래됐는지 웃긴데 아직도 C#에 있는 것처럼 멋진 문자열 클래스는 없어.저는 자바에서 몇 년 동안 일했고 지금도 c#을 하고 있습니다.Java를 실행하면 문자열의 c# 언어의 완전성이 없어집니다.주로 현악기가 그리워요.빈 문자열Is Null Or Empty(문자열).저도 소문자 문자열이 너무 그리워요.

++++1을 사용하여 Java에 추가합니다.모든 회피책은 바로 그것입니다.2020년 이후 해피 코딩!!

청구자용""그리고.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(11String등.EMPTY)Pointers 1개체로.

아니면:-

myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";

10개체에 10가지 조언.

이것은 큰 응용 프로그램을 통해 상당할 수 있는 것은 비효율적이다.

아마도 자바 컴파일러 또는 런타임 충분히 자동으로 같은 인스턴스에""의 모든 인스턴스로 있지만 그 결정을 시행한 추가 처리하지 않과 힘 효율적이다.

언급URL:https://stackoverflow.com/questions/3450604/why-is-there-no-string-empty-in-java