문자열 변수를 .equals ()를 사용하여 문자열 리터럴과 비교할 때 항목 순서에 대한 표준 사례가 있습니까? [닫은]


11

각각에 이점이 있으며 차이점을 이해하지만 모범 사례 / 표준 사례는 무엇입니까? 그리고 왜?

예를 들면 다음과 같습니다.

"myString".equals(myStringVar)
  • 잠재적 인 NPE를 피하고 널 검사가 필요하지 않습니다. (좋은 것?)
  • null 검사가 필요하지 않으므로 더 깔끔하게 읽을 수 있습니다.
  • null이 예상 값이 아닌 경우 프로그램이 더 현명하지 않고 중단 될 수 있습니다.

하나

myStringVar.equals("myString")
  • null이 예상 값이면 null 검사가 필요합니다. (좋은 것?)
  • null 검사로 복합 조건을 어지럽 힐 수 있습니다.
  • NPE가 문제가 있는지 알려주도록합니다.

어떤 변형이 Java에 사용되는 표준으로 간주되며 그 이유는 무엇입니까?


2
널 (null)이 예상 값인지 여부에 관계없이 "같음"조작이 문제인지 판별해야합니까?
Matthew Flynn

나는 그렇게 생각하지 않습니다. 그러나 그것은 나의 의견이다. 다른 사람들의 이론적 근거를 듣고 싶습니다.
BrandonV

과제 / 비교에 = 및 / 또는 ==를 사용하는 언어에서는 일반적으로 비교할 때 실수로 과제를 수행 할 수 없도록 변경할 수없는 것을 왼쪽에 두는 것이 가장 좋습니다. .equals와 같은 객체에서 메소드를 사용하는 언어의 경우 중요하지 않다고 생각합니다.
GordonM

답변:


3

나는 이것이 오래된 C (또는 C ++)로 프로그래밍 할 때 사용되는 안전 예방 조치에서 비롯된 것으로 생각됩니다. C에서는 평등을 테스트 할 때 실수로 값을 할당 할 수 있습니다.

if (x = 3)

이 조건은 x가 3인지 테스트하지 않고 xa 값 3을 할당하기 때문에 항상 참입니다.이 미묘한 버그를 피하기 위해 개발자는 조건을 반전시키기 시작했습니다.

if (3 = x)

여기에는 동일한 "버그"가 포함되어 있지만 컴파일러 오류가 발생하므로 더 안전합니다.

보다 현대적인 언어에는이 문제가 없으며 이러한 종류의 작업을 시도 할 때 쉽게 경고 할 수 있습니다. 따라서 순수한 선호도가 많지 않으므로 하나를 선택하고 일관되게 사용하십시오.


-1에 대한 Java 규칙의 이유가 아닙니다 equals. C와 달리 Java의 문제점 은 null 일 x.equals(y)때 표현식 이 NPE를 던진다는 것 x입니다. 문자열 리터럴이 "something"있고 대 / 소문자 null를 "같지 않음" 으로 간주하려는 경우 null이 될 수 "something".equals(y)있는지 여부 y를 모르면 작성 하는 것이 좋습니다 . 이것은 결코 NPE를 던지지 않을 것입니다.
Andres F.

1
  • 표준 및 모범 사례는 근무하는 조직의 문화에 따라 다릅니다.

  • .NET의 표준은 myStringVar == "myString"우리가 그것에 동의했기 때문에 간단합니다. 즉, 깨끗하고 간결하다고 믿습니다.

참고 : 이것은 ==객체 자체 대신 참조 를 비교하기 때문에 Java에는 적용되지 않습니다 . Java에서는을 사용해야합니다 myStringVar.equals("myString").


3
적어도 Java ==에서는 객체 참조 만 비교 하기 때문에 사용하지 마십시오 . 즉, 화해에 대한 +1-관습은 종종 "올바른"행동 방식을 정의합니다.
Michael K

이것을 지적 해 주셔서 감사합니다! 답변을 업데이트했습니다 :)
CodeART

@ CodeWorks : Michael의 요점을 놓친 것 같습니다. 또한 Java가 아닌 Java입니다.
amara

질문은 "하지만 모범 사례는 무엇입니까? 왜 그렇습니까?" 제 대답은 표준과 모범 사례가 조직마다 다릅니다. 당신은 그것에 동의하지 않습니까?
CodeART

@CodeWorks : 아무도 CodeWorks에 동의하지 않습니다. 그러나 모든 사람들은 myStringVar == "myString"Java에 대해 매우 나쁜 생각 이라고 동의 할 수 있습니다 (당신이 절대적으로 확신하지 않는 한 myStringVar).
amara

0

변수의 null 의미에 따라 달라집니다. 널이 될 것으로 예상하지 않고 확인하고 처리 할 필요가 없다면 첫 번째 양식이 더 깨끗합니다.

즉, 문자열 리터럴을 포함시키는 대신 더 나은 옵션은 다음과 같습니다.

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

특히 여러 곳에서 문자열을 사용할 가능성이있는 경우.


2
-1 : 실제로는 좋지 않습니다. 일반적으로 무시할만한 가치를 지닌 혼란을 더합니다
amara

@ sparkleshy-동의하지 않습니다. 코드 논리에 문자열 리터럴이 뿌려지는 것을 정말로 원하지 않습니다. 원래 답변에서 언급했듯이 문자열 리터럴이 둘 이상에서 사용되면 리팩토링한다고 정의합니다.
Benjamin Wootton

파이썬에서는 식별자가 기본적으로 문자열 리터럴이므로 파이썬을 철저히 배포해야합니다. 그리고 우리 모두 파이썬이 훌륭한 언어라는 데 동의해야한다고 생각합니다.
amara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.