StringUtils.EMPTY를 권장합니까?


91

StringUtils.EMPTY대신 사용 ""합니까?

반환 값으로 또는 String 변수의 값을 설정하는 경우를 의미합니다. 비교를 의미하지는 않습니다.StringUtils.isEmpty()

답변:


111

당연히 아니지. 정말로 ""가 충분히 명확하지 않다고 생각하십니까?

상수에는 기본적으로 3 가지 사용 사례가 있습니다.

  1. 값의 의미 문서화 (상수 이름 + javadoc 사용)
  2. 공통 값으로 클라이언트를 동기화합니다.
  3. 일부 초기화 비용을 피하기 위해 특별한 값에 대한 단축키를 제공하십시오.

여기에는 적용되지 않습니다.


33
.NET에 대한 사소하고 드문 사용 사례가 여전히 하나 있습니다 StringUtils.EMPTY. 빈 문자열의 사용이 의도 된 것이지 어떤 종류의 게으름이 아님을 분명히합니다 ( "오, 문자열이 필요합니다 "". 전달합시다 "). 누군가이 코드를 치면 변경하기 전에 두 번 생각할 것입니다. 또한를 StringUtils.EMPTY자신의 변수로 정의한 경우 MyClass.EMPTY"빈 표현"을 변경하려면 코드 한 줄을 변경해야합니다. 예를 들어 "<empty>"빈 String 대신로 변경할 수 ""있습니다. 그러나 나는 이것이 너무 멀리 가고 있다고 생각합니다.
Timmos

5
마지막으로 매번 내 생각을하는 대신 열광 자들을 전진시키려는 건전한 주장이 있습니다. 감사.
알렉스

2
EMPTY는 어떻게 의미가 부족합니까? EMPTY는 목록에서 1과 2를 모두 충족합니다. 경험 많은 개발자들은 주니어 개발자들이 ""를 사용하는 것처럼 간단한 것을 엉망으로 만들 가능성을 심각하게 과소 평가하고 있습니다.
Andrew T Finnell

4
@AndrewTFinnell 이름 EMPTY은 빈 문자열 자체에 아직없는 의미가 없습니다. 특히, 특정 경우에 빈 문자열을 사용하기로 결정한 이유 를 문서화하지 않습니다 . 상수에 이름을 지정 ONE하고 값 대신 해당 상수를 사용하는 것이 중요하다고 가정 하는 것과 다르지 않습니다 .
Holger

6
""가 충분히 명확하지 않다고 생각하기 때문입니다. (비어 있습니까? 비어 있습니까? 내 글꼴 크기가 작아서 볼 수없는 공간이 있습니까? 비어있는 이상한 "보이지 않는"문자가 있습니까?
댄 Rayson가

60

나는 StringUtils.EMPTY리터럴을 숨기고 return StringUtils.EMPTY완전히 예상했던 것을 표현 하고 빈 문자열을 반환해야 한다는 것을 표현 ""하기 위해를 사용하면 ""쉽게 다른 것으로 변경 될 수 있고 이것은 아마도 실수 일 수 있다는 가정으로 이어질 수 있습니다. EMPTY더 표현력이 있다고 생각합니다 .


37
이것을 제안한 다른 사람들에 따르면 : 0에 ZERO를 사용하고 1에 ONE을 사용합니까?
Jon Skeet

9
나는 특별한 '빈'케이스를 정수 리터럴의 사용과 비교하지 않을 것입니다.
Christopher Klewes 2010

16
나는 찾을 StringUtils.EMPTY 적은 보다는 표현 "".
bacar

1
@JonSkeet 많이 존경합니다. 나는 당신이 여기서 틀렸다고 생각합니다. 당신과 나는 이것을 결코 만나지 못할 수도 있지만, 개발자가 그것을 엉망으로 만드는 경우 구문 검사를 제공하지 않기 때문에 리터럴 ""을 사용하지 않도록 만들어야 할 경우가 있습니다. 그리고 네, 저는 주니어 개발자들이 ""와 같은 단순한 것들을 엉망으로 만드는 것을 보았습니다. 나는 EMPTY를 ""가 아닌 다른 의미로 바꾸는 아이디어를 받아들이지 않습니다. 나는 컴파일러가 그 의미를 이해할 수 있다는 사실 때문에 EMPTY의 아이디어를 좋아합니다.
Andrew T Finnell

@AndrewTFinnell : "잘못된"은 확실히 주관적인 것에 대한 이상한 용어입니다. 아니요, EMPTY가 의미를 바꿀 것이라고는 생각하지 않습니다.하지만 저는 bacar처럼- ""를 사용하는 것보다 표현력이 더 뛰어나다는 것을 알게 되었으며 StringUtils.EMPTY, 당신이 말한 것이 그것에 대해 제 마음을 바꾸지 않았습니다. 개발자가 빈 문자열 리터럴을 아주 가끔 잘못 작성했다고 믿을 수 있습니다. 하지만 저는 백만 분의 1에 해당하는 문자열 리터럴의 명확성을 취할 것입니다 (테스트에서 쉽게 찾을 수 있기를 바랍니다 ... ) 버그, 개인적으로.
Jon Skeet

29

아니요, "".

문자 ""는 수정처럼 분명합니다. 의미에 대한 오해가 없습니다. 나는 당신이 왜 그것을 위해 클래스 상수가 필요한지 모르겠습니다. StringUtils대신 이 상수가 포함 된 패키지 전체에서 사용된다고 가정 할 수 있습니다 "". 그렇다고해서 사용해야한다는 의미는 아닙니다.

보도에 바위가 있으면 던질 필요가 없습니다.


6
"보도에 바위가 있으면 던질 필요가 없습니다." 6 살짜리 아들에게 말 해주세요.
roel

14

얼마나 많은 사람들이 ""가 실제로 빈 문자열이고 유니 코드의 눈에 띄지 않고 공백이없는 멋진 문자를 포함하지 않는다고 맹목적으로 가정하는 것에 대해 놀랐습니다. 선하고 품위있는 모든 것에 대한 사랑을 위해 가능할 때마다 EMPTY를 사용하십시오.


4
궁금합니다. 코드에서 이런 일이 발생하는 것을 본 적이 있습니까? 그렇다면 우발적 이었습니까? 아니면 의도적 이었습니까? 실수로하는 것은 어려울 것 같고, 의도적으로 비어 있지 않은 EMPTY 상수를 사용하여 내 자신의 StringUtils 클래스를 쉽게 생성하고 참조 할 수 있습니다.
Ian Robertson

5
@IanRobertson 네, 이런 일이 일어나는 것을 보았습니다. 실제로 꽤 자주. 사람들은 웹 사이트에서 항상 하나의 코드 세트에서 다른 코드 세트로 잘라내어 붙여 넣습니다. 구식 코드 세트를 사용하는 Clear Case를 사용하는 회사도 있습니다. 그런 다음 맹목적으로 Windows ISO 세트로 변환 된 다음 Git으로 이동하면 UTF-8로 변환됩니다. 코드 세트 문제를 해결하는 데 수많은 시간을 보냈습니다. 이것을 포함합니다.
Andrew T Finnell

3
@AndrewTFinnell 나는 일반적으로 어떻게 문제를 일으킬 수 있는지 확실히 알 수 있습니다. 그러나 비어 있지 않은 비어있는 String 상수를 얼마나 자주 보셨습니까?
이안 로버트슨

13

String인턴 과 클래스 초기화에 대해 얘기하는 사람이 아무도 없기 때문에 여기에 2 센트를 추가하겠습니다 .

  • 모든 String자바 소스에서 리터럴은 구금하고 있습니다 어떤 ""같은 객체StringUtils.EMPTY
  • 을 사용하면 클래스 가 선언되지 않은 경우에만 정적 멤버에 액세스하므로 클래스 StringUtils.EMPTY 초기화 할 수 있습니다 (JLS는 해당 지점에서 특정적임). 그러나 이며 이 클래스를 초기화하지 않도록, 마지막.StringUtilsEMPTY finalorg.apache.commons.lang3.StringUtils.EMPTY

JLS 12.4.1을 참조하여 String interningClass 초기화 대한 관련 답변을 참조하십시오 .


“최종으로 선언되지 않은 경우에만”이므로이 필드는 final로 선언되어 있으므로 액세스 하면 클래스 초기화가 발생 하지 않습니다StringUtils .
Holger 2011

@Holger는 일반적인 진술 이었지만 실제로 javadoc에 대한 링크로 편집하여 최종임을 보여줍니다 (따라서 클래스를 초기화하지 않습니다).
Matthieu

8

. return "";보다 짧기 때문에 나는 그것을 사용하고 싶지 않습니다 return StringUtils.EMPTY.

그러나 이것을 사용하는 한 가지 잘못된 이점은 return " ";대신 입력 return "";하면 다른 동작이 발생할 수 있다는 것입니다 (빈 문자열을 올바르게 테스트하는지 여부와 관련하여).


13
이것이 실제로 문제인 것을 관찰 한 적이 있습니까 ( ""를 뜻하는 곳에서 실수로 ""사용)? 개인적으로 나는 문자 그대로 더 읽기 쉬우 며 어떤 문제도 일으키지 않았습니다.
Jon Skeet

2
@Jon 아니요, 실제로 사용하는 이점을 찾으려고 노력했습니다.)
Romain Linsolas 2010

1
동등한 시간 규칙은 없습니다. 이점이 없으면 이점이 없습니다.
Erick Robertson

1
나는 ""또한 좋아하지 않는다 . 나는 같은 리터럴 문자열을 한 번 이상, 심지어 한 번만 입력하는 것을 싫어한다. 차라리 Constants.java 에서 상수를 선언하고 싶지만 소스 코드의 모든 곳에서 반복하지는 않습니다.
賈 可 Jacky

2
나는 추악 하다고 생각하고 return ( Apache의 StringUtils가 아닌 내 클래스 StringUtil 에서 선언) 을 사용하는 return "";것을 선호 합니다 . StringUtil.EMPTY
賈可재키

5

당신의 클래스가 커먼즈의 다른 것을 사용하지 않는다면,이 마법의 가치를 위해이 의존성을 갖는 것은 유감입니다.

StringUtils의 디자이너는이 상수를 많이 사용하며 이것이 올바른 일이지만 그렇다고해서 반드시 사용해야한다는 의미는 아닙니다.


저자가이 방법을 선택했기 때문에 받아 들일 수 있음을 의미했습니다 ( "마법의 가치"를 사용하지 마십시오). 그래도 비공개 여야합니다.
cherouvim

작성자는 코드에서 0을 자주 사용합니다. 상수 int ZERO = 0도 정의하는 것이 더 좋을까요? 그렇지 않다면 차이점은 무엇입니까?
Jon Skeet

6
상황에 따라 다릅니다. 이것이 FCKEditorStringUtils이면 EMPTY는 "<p> & nbsp </ p>"가되며 클래스의 모든 곳에서이 마법 값을 복제하는 대신 EMPTY가 재사용되는 것을보고 싶습니다. 따라서 EMPTY는 EMPTY_STRING이 아닌 EMPTY_CONTENT를 의미 할 것입니다 (따라서 ZERO 예제는 약간 불공평합니다). ERROR_VISA_INVALID = 0 상수를 다시 사용하지 않겠습니까?
cherouvim

1

솔직히 나도 많이 사용하지 않는다. 빈 문자열과 비교하려면 다음을 사용하십시오.StringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)또한 nullcheck를 수행하므로 빈 문자열과 비교하는 것과 정확히 동일하지 않습니다.
cherouvim

그리고 어떻게 campare null하시겠습니까? 의 두 번째 인수로 equals하지만 결과는 동일합니다false
Bozho

isNotEmpty의 반대이다 "".equals(…), 따라서,이 치료는 사실 null빈 문자열이 같은 입니다 빈 문자열과 비교하여 서로 다른 "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. 문자열이 비어 있는지 여부 만 알고 싶다면를 사용하십시오. 이것은 빈 문자열 이면 반환하고 문자열이 다음 과 같으면 a를 던지는 string.isEmpty()올바른 동작 이 있습니다 .trueNullPointerExceptionnull
Holger

1

StringUtils.EMPTY가독성을 위해 어떤 경우에는 유용하다고 생각 합니다. 특히 :

  1. 삼항 연산자 예.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. 메서드에서 빈 문자열을 반환하여 예를 확인하기 위해 정말 그렇게하고 싶었습니다.

또한 상수를 사용하여에 대한 참조 StringUtils.EMPTY가 생성됩니다. 그렇지 않으면 ""JVM이 문자열 풀에 이미 존재하는지 확인해야 할 때마다 문자열 리터럴을 인스턴스화하려고 시도하면 추가 인스턴스 생성 오버 헤드가 없습니다. 확실히 사용 StringUtils.EMPTY하면 문자열 풀을 확인할 필요가 없습니까?


4
여러 조회에 대한 귀하의 주장은 유효하지 않습니다. Java Language Specification 3.0의 13.4.9 장에서 StringUtils.EMPTY상수는 컴파일 타임에 해결 된다고 언급되어 있습니다.
Roland Illig 2014 년

4
문자열 풀의 존재, 당신은 같은 문을 실행하지 런타임 적 y를 한 번에, 컴파일 시간과 클래스 로딩시 체크
론의 후작

1
이후 StringUtil.EMPTY컴파일 시간 상수이고, 그 참조를 사용하는 것과 똑같은 바이트 코드로 컴파일 얻는다 ""직접. 또한 삼항 연산자가 차이를 만들어야하는 이유를 알 수 없습니다. 다른 것과 같은 표현입니다. 명명 된 상수를 사용하거나 사용하지 않는 이유는 삼항 연산자에도 적용됩니다.
Holger

1

아니, 쓸 게 더 많아서 그리고 문자열은 플랫폼 독립적 인 비어 있습니다 (Java에서).

File.separator "/"또는 "\"보다 낫습니다.

하지만 원하는대로하십시오. 다음과 같은 오타를 얻을 수 없습니다.return " ";


7
나는 왜 대부분의 프로그래머가 "너무 많이"쓰는 것을 두려워하는지 이해하지 못한다. StringUtils.EMPTY를 작성하면 읽기 쉬운 자체 주석 코드를 얻을 수 있습니다. 그리고 Steve McConnell (또는 그가 Code Complete 2.0에서 인용 한 일부 연구)에 따르면 코드는 작성된 것보다 7 배 더 많이 읽 힙니다.
Paweł Dyda 2010

1
당신은 특정 맞아,하지만 "".equals (someString)는 StringUtils.EMPTY.equals로 쉽게 읽을 수로 (someString)입니다
기독교 Kuetbach

StringUtils.EMPTY.equals (someString)을 잘못 작성하면 구문 오류가 발생합니다. "".equals (someString)는 그렇지 않습니다. 이것이 EMPTY를 사용해야하는 유일한 이유입니다.
Andrew T Finnell

1
@AndrewTFinnell 그래서 건전한 프로그래머가 someString.isEmpty()대신 쓰는 이유 입니다.
Holger 2011

-2

예, 말이됩니다. 이것이 유일한 방법은 아닐 수도 있지만 "말이 안 돼"라고 말하는 방식은 거의 보이지 않습니다.

제 생각에는 :

  • ""보다 더 돋보입니다.
  • 그것은 당신이 비어 있음을 의미했으며 그 공백은 아마도 그렇지 않을 것임을 설명합니다.
  • 자체 변수를 정의하지 않고 여러 위치에서 사용하는 경우에도 모든 곳에서 변경해야합니다.
  • 코드에서 자유 문자열 리터럴을 허용하지 않으면 도움이됩니다.

It will still require changing everywhere if you don't define your own variable and use it in multiple places.빈 문자열을 다른 빈 문자열로 변경 하시겠습니까?
Pita

@Pita 죄송합니다. ""대신이 인라인을 사용하면 자신의 상수를 정의하고 여러 위치에서 재사용하는 것과 동일한 이점을 얻지 못합니다. 그것은 StringUtils.EMPTY에 대한 논쟁이 아니며, '이치에 맞더라도'많이 얻지 못한다는 설명입니다. 개인적으로 설명적인 이름으로 상수를 만든 다음이를 할당합니다. 개발자가 단일 공백을 의도하고 빈 문자열로 끝나는 몇 가지 경우를 보았습니다.이 양식에서는 발생하지 않습니다.
Oron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.