시스템의 Java 부분 외부에서 열거 형을 참조하기 위해 문자열 또는 int를 사용하는 것이 더 낫습니까?


11

우리는 Java에서 열거 형을 사용하는 것에 대해 내 작업에서 토론했습니다.

동료는 서버 측에서 열거 형을 사용할 때 필요할 때마다 문자열을 사용하여 참조 할 필요가 있다고 주장했습니다 (예 : JS에서 서버로 데이터를 보낼 때 또는 데이터베이스에 저장할 때). 또한 개발자에게는 오타가 있으면 빨리 실패 할 것이라고 주장했습니다.

나는이 경우 불변의 식별자 일 것이고 대소 문자와 오타 문제가 없기 때문에 항상 정수를 사용하여 열거 형을 식별했습니다 (개발자가 1 대신 2 값을 사용하는 실수를 저지른 경우에도 빠르게 실패하지는 않습니다).

이러한 주장에 대해 매우 분석적이므로 문자열을 사용하는 것이 더 좋다고 말하지만 (좋은 접근 방식이 아닌 것처럼) 이상한 느낌을 얻습니다.

이 토론에서 나를 안내 할 수있는 모범 사례가 있습니까?

편집 : 가능할 때마다 열거 형 자체를 사용하므로 모든 Java 코드가 열거 형을 사용합니다. "enum에 대한 참조"란 의미는 JavaScript에서 서버로 데이터를 교환하거나 데이터베이스에 데이터를 저장할 때 열거 형의 값을 참조 함을 의미합니다.


1
"enum에 대한 참조"란 무엇입니까? 소스 코드 내에서 정상적으로 사용합니까? 데이터베이스에 저장하기위한 직렬화? 사용자 문서에 사용할 표현? 기술 문서에서 사용할 표현? 그 대답은 모든 사람들에게 상당히 다를 것입니다.
Kilian Foth

내가 질문을 편집 한 내가 지금 명확 희망 : 나는 주위 Server 또는 다른 방법으로 자바 스크립트에서 데이터를 교환하거나 데이터베이스에 값을 저장할 때 값을 참조하는 의미 "열거 참조"에 의해
JSBach

자바 스크립트 API에서는 확실히 문자열을 사용합니다. DB에서 두 가지 장점이 있습니다. 일부 데이터베이스에는 enum 지원 기능이 내장되어 있습니다.
코드 InChaos

답변:


15

좋은 질문. Java에서 enum 사용은 주로 다소 범주적인 정보를 처리하기위한 것입니다. 카드가 가질 수있는 네 가지 유형의 정장을 처리하기 위해 enum을 사용하는 전형적인 예입니다. 정수 사용의 모든 성능 이점을 제공하며 프로그램에서도 명확합니다.

Java 외부에서 정수를 계속 사용하지 않는 이유는 무엇입니까? 아마도 Java 외부에 열거 형 유형이 없을 수도 있지만 성능 목적으로 정수를 계속 사용할 수는 없습니다. 네, 새로운 사실입니다. 새로운 열거 형 값을 추가 할 때 어떤 일이 발생하는지 고려하십시오. 끝에 추가하지 않으면 새 값 뒤에 다른 모든 열거 형 값이 1 씩 증가합니다. 글쎄, 우리는 숫자를 지정하여 변경할 수 없거나 항상 끝에 추가합니다. 동료 동료가 항상 그렇게 할 것이라고 확신하십니까? 메? 아마? 잘만되면? 어쩌면 당신은 100 %가 아닐 수도 있습니다. 잠시 염두에 두십시오.

상사는 마지막 업데이트 후 소프트웨어를 사용하는 클라이언트에 혼란이 있음을 알려줍니다. 이제 모든 엔터티 X는 실제로 Z가 할당 된 경우에도 열거 형 값 Y가 할당 된 것처럼 작동합니다. 리포지토리를 확인하고 예, 누군가 새로운 열거 형 값을 추가했으며 요청한대로 가이드 라인을 따르지 않았습니다. 지금 당신은 정말, 3되어야한다 때 데이터베이스에, 4 작성하는 추가 합병증이 제외 정말 업데이트 이전에 삽입 된 기록 입니다 어쨌든 4 4. 무엇 열거 값이 속하는? Y 아닌가요? 기억이 안나 확인하려면 프로그램을 확인해야합니다. 간단히 말해, 엉망입니다.

대신 데이터베이스가 "HEARTS", "DIAMONDS", "SPADES", "CLUBS"를 쓴 경우 공간 측면에서 거의 손실이없고 많은 이익을 얻었습니다. 사소한 성능 저하에 대해 이야기하는 것이 사실이지만, 종종 차이를 만들기 위해 데이터베이스에 액세스해서는 안됩니다. 공간은 시스템 관리자에게 맡기십시오 (문제가 아님).

변경하기 쉬운 간단한 프로그램을 만들었다면 장기적으로 자신에게 호의를 베 풀었습니다. 그것의이 측면은 나의 겸손한 의견에서 다르지 않습니다.


2
좋은 점은,하지만 당신은 누군가가 열거 개체 중 하나의 이름 (변경하기로 결정 사건에 대해 잊고있어 HEARTSHeart다시 나 뭔가 귀하의 예제에서) 갑자기 모든 것을 나누기.
Scott Whitlock

1
@ScottWhitlock 당신이 그것을 설명하지 않는다면, 그것들의 이름을 완전히 바꾸기로 결정할 수도 있습니다. 실수로 데이터베이스를 삭제하고 프로젝트를 삭제할 수도 있지만 여기서 가능한 모든 사건을 설명 할 수는 없습니다.
Neil

5
@ Neil-사실이지만 우리는 여기서 확률을 재생하려고합니다. Java 열거 형에 익숙하지 않지만 C #에서는 데이터베이스 외부에서와 같이 프로그램 외부에서 값이 의미가 있어야하는 경우 명시 적으로 열거 형에 대한 값을 설정합니다 (예 : Hearts = 1, Diamonds = 2 등). . 이것이 열거 형을 사용하는 기본 방법이 아니기 때문에 나중에 편집기를 일시 중지해야합니다. 또한 이것들이 사용되는 곳을 지적하는 주석이 편리합니다.
Scott Whitlock

1
@ScottWhitlock 그것은 그러한 문제를 피하기 위해 그것에 대해 갈 수있는 가장 좋은 방법입니다. 그렇게했다고 가정하더라도 데이터베이스에는 여전히 1, 2, 3, 4가 표시되거나 일부 파일에서는 직렬화됩니다. 유지 보수 관점에서 슬라이스 방식에 이상적이지 않습니다.
Neil

2
추가하면 열거 형이 문자열로 직렬화되고 누군가가 열거 형의 이름을 변경하면 직렬화 해제 중에 구문 분석 중에 오류가 발생합니다. 열거 형이 int이고 누군가가 정의를 변경하면 처리하는 동안 오류가 줄어 들어 진단하기가 더 어려워집니다. CC @ScottWhitlock.
Endy Tjahjono 2016 년

1

나는 Neil의 대답에 동의하지만 추가 사항입니다.

자바 열거 형은 객체이므로 필드와 메소드를 가질 수 있습니다. 따라서 각 열거 형에 수동으로 지정된 값을 부여 할 수 있으며 외부 작업에 대해 참조 할 때 해당 값을 대신 사용하십시오.

열거 형 인스턴스의 추가 / 제거 / 재정렬과 이름 변경 모두에서 살아남을 것입니다. 그러나 많은 도구에서 사용할 수있는 automagic을 사용하는 대신 열거 형 필드에 대한 직렬화 / 직렬화 논리를 작성해야합니다. (쉽지만 추가 작업).

그리고 값을 수동으로 고유하게 유지해야하지만 (C 스타일 열거 형과 동일) 테스트를 작성하여 확인할 수 있습니다.


예, 우리는이 길을 갔지만 최대 절전 모드를 사용하고 있으며 데이터베이스와의 값을 구문 분석 할 수있는 몇 가지 코드를 추가해야했고 이상한 것처럼 보였으므로 .STRING 관계를 사용하기로 결정했습니다. 열거 형 이름으로 이동하십시오.
JSBach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.