열거에 대해
장소에 쓰여진 대부분의 열거는 열거 된 다음 예제가 전환되기 시작합니다. 그러나 내 코드의 데이터가 열거, 일반적으로 문자열이나 숫자가 될 가능성이 없다고 말하고 싶습니다. 예를 들어, SQL을 구문 분석 한 후 먼저 SQL 유형을 결정합니다. SQL 토큰을 가로 채면 인터셉트는 선택, 삭제, 업데이트, 삽입, Alter 등이 될 수 있지만 모두 문자열입니다. 현재 나는 열거를 사용하고 싶지만 할 수는 없습니다. 문자열을 열거로 변환하는 방법? 비슷한 상황에는 데이터베이스에서 데이터를 꺼내고 일부 유형을 기반으로 판단하고 페이지에서 데이터를 전달하며 다른 유형에 따라 다른 작업을 수행하지만 열거가 아닌 모든 문자열입니다. 비극은 내가이 일을 쓰는 사람을 거의 보지 않는다는 것입니다. 그래서 나는 누군가가 그것을 사용할 수 있기를 바라고 기록했다.
우선, 왜 열거를 사용합니까? 열거를 사용하는 것이 더 낫습니까? 열거를 사용하는 장점은 무엇입니까?
나는 당신이 어떤 카테고리 클래스에 있고 열거되고 변하지 않은 유형을 열거하고 변하지 않을 때, 프로그램을 다른 장소로의 경로로 안내하기 위해 열거를 사용하는 것이 더 나은 선택이라고 생각합니다.
약간 혼란스러워 보이지만 예를 들어 이해 될 수있는 예가 있습니다.
우리는 매일 근무일에하는 일을 나열 할 수 있습니다.
일하러 가고, 회의를하고, 먹고, 잠을 자고 등.
병원의 ENT 부서에서 검사해야 할 부품을 나열 할 수 있습니다.
눈, 코, 귀, 입 등
이것들은 열거 될 수 있으며, 우리는 그들 각각을 다른 방식으로해야합니다.
물론 당신은 다음과 같이 말할 수 있습니다.
1. 구성 파일 또는 주석을 통해 동적으로 발산 될 수 있습니다.
2. 상수는 유사한 효과를 달성하는 데 사용될 수있다.
3. 문자열의 평등을 통해 직접 표현하고 다른 경우 표현하십시오.
구성 추가 메소드를 사용하여 발송하면 유연하고 수정하기 쉽습니다. 그러나 자주 수정되지 않은 많은 매개 변수를 사용하면 종종 구성 부담이 증가하고 시스템 로직을 읽어야 할 때 구성과 코드를 다시 읽어야합니다. 그러나 매개 변수가 동적으로 변환 가능한 정보 인 경우 구성을 사용하는 것이 올바른 선택입니다.
상수의 사용은 일반적으로 케이스를 전환 할 때 숫자이며 문자열은 Java에서 스위치 케이스가 될 수 없습니다. 상수를 사용하는 목적은 사례 1 및 사례 2보다 가독성이 증가하지만 문자열 데이터도 번거 롭습니다. 다시 매핑되지 않으면 필요하지 않습니다. 실제로, 열거는 거의 한 번도 매핑되었지만 코드를 캡슐화합니다. 그것이 완료되고 구문 적으로 지원되었으므로 왜 그것을 사용하지 않겠습니까! 둘째, 상수는 가독성을 증가 시키지만 카테고리 및 관리 유형의 개념은 없습니다. 즉, 열거 정의는 범주를 정의 하여이 범위에 필요한 것들을 잘 나열 할 수 있습니다. 상수는 일반적으로 자체적으로 정의 된 일부 풀이며, 일부 공개 클래스에 배치되거나 무작위로 정의되며 상대적으로 흩어져 있습니다. 또한, 열거는 전환 할 때 명확하게 정의되며 케이스는 잠금 열거 범위 내에 있습니다. 시스템을 제어 할뿐만 아니라 가독성을 높일뿐만 아니라 구성 파일을 보는 기능을 달성하기 위해이 범주의 열거 정보가 언제라도 확인할 수 있습니다. 그러나 여전히 그 문장에서 반환됩니다. 매개 변수가 가변적이면 열거에 적합하지 않습니다. 열거는 열거 할 수 있거나 현재 시스템 고려 사항을 열거 할 수 있어야합니다. 예를 들어, 위의 병원에는 많은 병원이있을 수 있지만 현재 병원은 몇 가지 부분 만 처리하고 다른 부분을 처리하지 않습니다. 이것이 이유입니다. 변수는 무엇입니까? 예를 들어, URL 매개 변수는 해당 방법으로 발송됩니다. 모든 사람이 논리를 추가하고 열거 자와 케이스를 추가하는 것은 불가능합니다. 현재 [Configuration + Dynamic Method Dispatch]를 사용하는 것이 좋습니다. 물론 구성은 파일 또는 주석 일 수 있습니다.
가장 소박한 것은 문자열을 사용하여 다른 경우 문자열을 구현하는 것입니다. 하하, 이것에는 아무런 문제가 없지만 이것은 흩어져있는 방식으로 쓰여져 있습니다. 둘째, 각 일치하는 각 평등은 평등과 일치 할 때마다 각 문자와 비교해야합니다. 코드에서 많이 루프하면 성능이 좋지 않으며 위의 설명을 살펴본 후 나머지는 더 명확 해집니다.
둘째, 열거는 유형 관리 구성 요소를 제공하여 객체 지향 시스템을보다 완벽하게 만들어 일부 유형의 관리를 구성하고 관리 할 수 있습니다. 열거가 사용되는 경우, 처리 된 열거의 정의를 찾을 수 있으며, 처리되지 않은 열거의 정의를 찾을 수 있으며, 위는 달성하기가 어렵다. 예를 들어, 데이터베이스에 정의 된 10 가지 유형의 작동 유형이 있으므로 결정 프로세스에서 열거는 구성 파일처럼 볼 수 있으며 관리하기가 매우 간단합니다.
마지막으로, 열거는 절대적으로 싱글 톤이며, 비교 성능은 디지털 성능의 성능과 비교하여 가독성과 성능을 얻을 수 있습니다.
열거 유형의 기본 사용
이러한 이론적 근거로 Java의 열렬한 열거 유형을 살펴 보겠습니다.
1. 열거에 변수와 방법을 추가 할 수 있습니다
코드 예를 살펴 보겠습니다.
public enum state {normal ( "normal", 1), update ( "Updated", 2), deleted ( "deleted", 3), fireed ( "masked", 4); // 멤버 변수 개인 문자열 이름; 개인 INT 인덱스; // 구성 메소드, 참고 : Enum은 개인 상태를 인스턴스화 할 수 없기 때문에 생성자가 공개 될 수 없습니다 (문자열 이름, int index) {this.name = name; this.index = index; } // 일반 메소드 public static string getName (int index) {for (state c : state .values ()) {if (c.getIndex () == index) {return c.name; }} return null; } // set method get public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public int getIndex () {return index; } public void setIndex (int index) {this.index = index; }}위의 코드에서 열거 값을 정의한 후 세미콜론을 추가 한 후 다른 변수와 메소드를 정의 할 수 있음을 알 수 있습니다. 특히 열거의 구성 방법은 공개적으로 식별 할 수 없으므로 사용자가 열거를 인스턴스화하지 못하도록 수행됩니다.
2. 상수를 정의하는 데 사용될 수 있습니다
먼저 Java에서 상수를 정의하는 방법을 검토하고 다음 코드를 참조하십시오.
public static final int normalstate = 1; private static final int updatestate = 2;
아래에서는 위의 상수 정의를 대체하기 위해 Enum enum을 사용할 수 있습니다. 코드는 다음과 같습니다.
Public Enum State {정상, 업데이트, 삭제, 해고}}Enum을 사용하여 Java에서 상수를 정의하는 데는 구문 이점이 없지만, Enum Enum 유형은 더 많은 작동 기능을 제공 할 수 있습니다.
3. 열거에서 인터페이스를 구현하십시오
먼저 다음 코드를 살펴 보겠습니다.
public interface icanreadstate {void read (); String getState ();} public enum state는 iCanreadState {normal ( "normal", 1), update ( "Updated", 2), deleted ( "deleted", 3), fireed ( "masked", 4); 개인 문자열 이름; 개인 INT 인덱스; 개인 상태 (문자열 이름, int index) {this.name = 이름; this.index = index; } // 인터페이스 메소드 1 @override public string getState () {return this.name; } // 인터페이스 메소드 2 @override public void read () {system.out.println (this.index + ":" + this.name); }}일반 클래스에서 인터페이스를 사용하는 것과 마찬가지로, Enum Enum은 인터페이스를 상속하고 인터페이스에서 모든 메소드를 구현할 수 있습니다. 이것의 장점은 열거 값에 대한보다 편리하게 정렬, 비교 및 기타 작업을 수행 할 수 있으며 더 나은 캡슐화를 가질 수 있다는 것입니다.
예
먼저 간단한 열거를 정의합시다 (여기에 예제가 있으므로 단순히 3 개의 변수를 정의 할 것입니다).
public enum sqltypeenum {삽입, 업데이트, 삭제, select}SQL을 구문 분석 한 후, 토큰이 얻어진다. 이 토큰의 열거를 어떻게 얻습니까?
이렇게 얻으십시오.
String token = "select"; sqltypeenum sqltypeenum = sqltypeenum.valueof (token.touppercase ());
얻지 못하면 Java는 예외를 던질 것입니다. 불법 행위 예시 없음 Enum const class sqltypeenum.xxx
내가 자본화하는 이유는 열거가 자본화되기 때문입니다 (물론 열거가 소문자 인 경우 소문자이지만 혼합하는 것이 더 번거 롭습니다). 실제로, 가치는 열거의 기본 매핑을 호출합니다.
이 방법은 호출 할 때 호출됩니다.
따라서 내부에 해시 맵도 있습니다, 하하!
이 정보를 얻은 후에는 원하는 작업을 수행 할 수 있습니다.
switch (sqltypeenum) {케이스 삽입 : 삽입 로직; 부서지다; 케이스 삭제 : 핸들 삭제 로직; 부서지다; ....}좋아, 때로는 삽입 또는 업데이트와 같은 문자열을 상호 작용에서 직접 사용하고 싶지 않을 수도 있습니다.
예를 들어 일부 사용자 작업 유형을 정의합니다.
1. 사용자 정보 저장
2. ID를 통해 기본 사용자 정보를 얻습니다
3. 사용자 목록을 가져옵니다
4. ID를 통해 사용자 정보를 삭제합니다
등.
열거를 다음과 같이 정의 할 수 있습니다.
public enum useroptionenum {save_user, get_user_by_id, get_user_list, delete_user_by_id}그러나 시스템 방법과 일부 키워드 구성은 일반적으로 다음과 같이 작성됩니다.
SaveUser, GetUserByid, GetUserByid, DeleteUserByid
물론 각각 고유 한 규칙이 있지만 중간에 매핑을하고 싶지 않다면 타협합니다. 이상하게 보이는 모든 열거 이름을 바꾸거나 더 이상한 모든 메소드 이름을 교체하거나 스스로 매핑 할 수 있습니다. 좋아, 조금 더 번거 롭지 만 실제로는 번거롭지 않습니까?
먼저 열거 된 밑줄 스타일 데이터를 낙타로 변환하는 메소드를 작성하고이를 stringUtils에 넣어 봅시다.
public static String convertdbstyletojavastyle (문자열 dbstylestring, boolean firstupper) {dbstylestring = dbstylestring.tolowercase (); 문자열 [] 토큰 = dbstylestring.split ( "_"); StringBuilder StringBuilder = New StringBuilder (128); int 길이 = 0; for (string token : tokens) {if (stringUtils.isnotblank (Token)) {if (length == 0 &&! firstUpper) {StringBuilder.append (Token); } else {char c = token.charat (0); if (c> = 'a'|| c <= 'z') c = (char) (c -32); StringBuilder.Append (c); StringBuilder.append (Token.substring (1)); }} ++ 길이; } return stringBuilder.toString (); }메소드 과부하 :
public static String convertdbstyletojavalocalstyle (String dbstylestring) {return convertdbstyletojavastyle (dbstylestring, false); }그런 다음 열거를 정의하십시오.
public enum useroptionenum {save_user, get_user_by_id, get_user_list, delete_user_by_id; 개인 최종 정적 맵 <String, userOptionEnum> enum_map = new Hashmap <String, userOptionEnum> (64); static {for (userOptionEnum v : values ()) {enum_map.put (v.toString (), v); }} public staticuseroptionenum fromstring (String v) {useroptionenum useroptionenum = enum_map.get (v); useroptionenum == null을 반환하십시오. 기본값 : userOptionEnum; } public String toString () {String StringValue = super.toString (); Return StringUtil.convertDBStyletojavalocalStyle (StringValue); }}자, 이벤트 매개 변수를 전달하여 다음과 같은 경우 SaveUser를 사용하십시오.
문자열 이벤트 = "SaveUser"; // 매개 변수를 받으면 userOptionEnum enum = userOptionEnum.fromString (이벤트);
사실, 나는 해시 맵을 직접 만들었고, 열거에 약간의 제한이 있기 때문에 FromString을 추가했으며 일부 방법은 메소드의 가치와 같은 과도하게 작성할 수 없습니다.
사실, 할 말이 없습니다. 열거에 몇 가지 사용자 정의 변수를 추가하는 것에 대해 이야기합시다. 실제로 싱글 톤을 제외하고 다른 열거는 일반 클래스와 유사합니다. 또한 생성자 방법을 가질 수 있지만 기본적으로는 아닙니다. 또한 사용자 지정 변수를 제공 한 다음 세트를 얻고 메소드를 얻을 수 있습니다. 그러나 설정이있는 경우 스레드가 안전하지 않으므로이 시점에주의하십시오. 따라서 건축 방법은 일반적으로 작성됩니다.
public enum sqltypeenum {insert ( "insert in in in insert"), delete ( "delete") ...... 생략; 개인 문자열 이름; // 사용자 정의 변수 정의 개인 sqltypeenum (문자열 이름) {this.name = name; } public String getName () {return name; } public String toString () {return name + "i dash"; // tostring 메소드를 다시 작성} // 일반적으로 권장되지 않음 공개 void setName (String name) {this.name = name; }}라고 불리는:
sqltypeenum sqltypeenum = sqltypeenum.valueof ( "insert"); system.out.println (sqltypeenum); system.out.println (sqltypeenum.getname ());
호출하는 것이 좋습니다.
sqltypeenum.setName ( "젠장");
다른 스레드에서 :
sqltypeenum sqltypeenum = sqltypeenum.valueof ( "insert"); system.out.println (sqltypeenum); system.out.println (sqltypeenum.getname ());
결과가 변경되었다는 것을 알았습니다.