列挙について
場所に記載されている列挙のほとんどには、列挙が与えられ、その例は切り替え始められます。しかし、私のコードからのデータは、通常は文字列または数字である可能性は低いと言いたいです。たとえば、SQLを解析した後、最初にSQLタイプを決定します。 SQLトークンを傍受することにより、インターセプトは選択、削除、更新、挿入、変更などになりますが、それらはすべて文字列です。現時点では、enumsを使用したいのですが、できません。文字列を列挙に変換する方法は?同様の状況には、データベースからデータを取り出し、いくつかのタイプに基づいて判断を下し、ページからデータを渡すこと、異なるタイプに応じて異なる操作を行うことが含まれますが、それらはすべて列挙ではなく文字列です。悲劇は、私がこのことを書いている人がめったにないということです。だから私はそれを書き留めて、誰かがそれを使うことができることを望んでいます。
まず第一に、なぜ列挙を使用するのですか?いつ酵素を使用する方が良いのですか?列挙を使用することの利点は何ですか?
いくつかのカテゴリクラスにいて、プログラムをさまざまな場所にルーティングするように導くために列挙して変更されていないタイプを列挙して変更できない場合、列挙を使用することがより良い選択であると思います。
少し混乱しているように聞こえますが、理解される可能性のある例があります。たとえば
私たちは毎日の営業日に私たちが行うことをリストすることができます:
仕事に行き、会議をしたり、食べたり、眠ったりします。
病院のENT部門で検査する必要がある部品をリストできます。
目、鼻、耳、口など
これらは列挙でき、それぞれを異なる方法で行わなければなりません。
もちろん、あなたは言うことができます:
1.構成ファイルまたは注釈を介して動的に発送できます。
2。定数を使用して、同様の効果を達成できます。
3.文字列の等しいものを通して直接表現し、他の場合にそれを表現します
構成追加方法を使用してそれを派遣すると、柔軟で簡単に変更できます。ただし、頻繁に変更されていない多くのパラメーターを使用する場合、構成の負担を増やすことがよくあり、システムロジックを読み取る必要がある場合は、構成とコードを再度読み取る必要があります。ただし、パラメーターが動的に変換可能な情報である場合、構成を使用することが正しい選択です。
定数の使用は通常、ケースを切り替えるときの数値であり、文字列はJavaのスイッチケースにすることはできません。定数を使用する目的は、ケース1およびケース2よりも読みやすさを向上させます...しかし、文字列データも面倒です。再度マッピングされない限り、必要はありません。実際、列挙はほぼマッピングされていますが、コードをカプセル化するだけです。それが行われ、構文的にサポートされているので、なぜそれを使用してみませんか!第二に、定数は読みやすさを増加させますが、カテゴリと管理タイプの概念はありません。つまり、列挙定義はカテゴリを定義します。カテゴリは、この範囲に必要なものを適切にリストできることです。定数は通常、それ自体で定義されたいくつかのプールであり、一部の公開クラスに配置されているか、ランダムに定義されており、比較的散在しています。さらに、列挙は切り替え時に明確に定義され、ケースはロック列挙の範囲内にあります。システムを制御し、読みやすさを向上させるだけでなく、このカテゴリのどの列挙情報がいつでも確認して、構成ファイルを調べる機能を達成することもできます。しかし、パラメーターが可変の場合、列挙に適していない場合、その文でまだ戻ります。列挙は列挙可能である必要があります。そうしないと、現在のシステムに関する考慮事項を列挙できます。たとえば、上記の病院には多くの病院があるかもしれませんが、現在の病院はいくつかの部品のみを処理し、他の部品を処理しません。これが理由です。可変とは何ですか?たとえば、URLパラメーターは対応する方法に発送されます。誰もがロジックを追加して列挙者とケースを追加することは不可能です。現時点では、[構成 +動的メソッドディスパッチ]を使用する方が良いです。もちろん、構成は単なるファイルまたは注釈にすることができます。
最も素朴なことは、文字列等しいものを使用して、他の場合に実装することです。ハハ、これには何も問題はありませんが、これは散らばった方法で書かれています。第二に、一致する各等しいものは、等しいものを一致させるたびに各文字と比較する必要があります。コードで多くのループをループすると、パフォーマンスはあまり良くなく、上記の説明を見た後、残りはより明確になります。
第二に、列挙はタイプ管理コンポーネントを提供し、オブジェクト指向のシステムをより完全にするため、一部のタイプの管理を構成および管理できます。列挙が使用される場合、処理され、処理されていない列挙の定義を見つけることができ、上記を達成することは困難です。たとえば、データベースで定義されている10種類の操作タイプがあるため、決定の過程で列挙は構成ファイルのように表示でき、管理は非常に簡単です。
最後に、列挙は絶対にシングルトンであり、比較のパフォーマンスはデジタルパフォーマンスのパフォーマンスに匹敵し、読みやすさとパフォーマンスを得ることができます。
列挙タイプの基本的な使用
このような理論的根拠がある場合は、Javaの列挙列タイプを見てみましょう。
1.列挙に変数とメソッドを追加できます
コードの例を見てみましょう。
public enum state {normor( "remorm"、1)、update( "updated"、2)、削除( "削除"、3)、fired( "masked"、4); //メンバー変数プライベート文字列名。プライベートインデックス; //構築方法、注:enumをインスタンス化できないため、コンストラクターは公開できません。 this.index = index; } //通常の方法public static string getName(int index){for(state c:state .values()){if(c.getIndex()== index){return c.name; }} nullを返します。 } // get setメソッドpublic string getname(){return name; } public void setName(string name){this.name = 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。列挙にインターフェイスを実装します
まず次のコードを見てみましょう。
パブリックインターフェイスicanreadstate {void read(); String getState();} public Enum State State Implestion icanreadstate {normor( "remorm"、1)、update( "updated"、2)、削除( "削除"、3)、fired( "masked"、4);プライベート文字列名;プライベートインデックス; Private State(String name、int index){this.name = name; this.index = index; } //インターフェイス方法1 @Override public String getState(){return this.name; } //インターフェイス方法2 @Override public void read(){system.out.println(this.index + ":" + this.name); }}一般クラスでインターフェイスを使用するのと同じように、列挙列挙はインターフェイスを継承し、インターフェイス内のすべてのメソッドを実装することもできます。これの利点は、より便利に並べ替え、比較、および列挙の値を比較し、その他の操作をより良いカプセル化することができることです。
例
最初に単純な酵素を定義しましょう(ここに例がありますので、3つの変数を単に定義します):
public enum sqltypeenum {挿入、更新、削除、選択}SQLを解析した後、トークンが取得されます。このトークンの列挙をどのように取得できますか?
このように入手してください:
string token = "select"; sqltypeenum sqltypeenum = sqltypeenum.valueof(token.touppercase());
取得しない場合、Javaは例外をスローします:IllegalargumentException enum const class sqltypeenum.xxx
私が大文字化する理由は、列挙も大文字になっているためです(もちろん、列挙は小文字である場合、小文字ですが、混ぜる方が面倒です)。実際、Valueofは、列挙の基礎となるマッピングを呼び出します。
この方法は、呼び出すときに呼び出されます。
そのため、内部にはハッシュマップもあります!
この情報を取得した後、目的の操作を実行できます。
switch(sqltypeenum){case insert:handle insert logic;壊す;ケース削除:削除ロジックを処理します。壊す; ....}OK、挿入などの文字列をインタラクションで直接更新することを望まない場合があります。多くの場合、命名仕様が必要であるためです。
たとえば、いくつかのユーザーアクションタイプを定義します。
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
もちろん、それぞれに独自のルールがありますが、真ん中でマッピングをしたくない場合は、妥協するだけです。非常に奇妙に思えるすべての列挙名を交換するか、すべてのメソッド名をさらに奇妙なものに置き換えるか、自分でマッピングすることができます。 OK、もう少し面倒ですが、実際には面倒ではありませんか?
まず、列挙されたアンダースコアスタイルのデータをラクダに変換する方法を書き、それをstringutilsに入れましょう。
public static string convertdbstyletojavastyle(string dbstylestring、boolean firstupper){dbstylestring = dbstylestring.tolowercase(); string [] tokens = dbstylestring.split( "_"); StringBuilder StringBuilder = new StringBuilder(128); int length = 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、使用:
string event = "SaveUser"; //パラメーターuseroptionenum enum = useroptionenum.fromstring(event)を取得した場合;
実際、私は自分でハッシュマップを作成しました。列挙にいくつかの制限があるため、からのいくつかの制限があり、いくつかの方法では値のような上書きを許可しないため、FromStringを追加しました。
実際、何も言うことはありません。列挙にいくつかのカスタム変数を追加することについて話しましょう。実際、シングルトンであることを除いて、他の酵素は通常のクラスに似ています。また、コンストラクターメソッドを持つこともできますが、デフォルトではありません。また、カスタム変数を提供してから、セットを取得してメソッドを取得することもできます。ただし、セットがある場合、スレッドは安全ではないため、この点に注意してください。したがって、建設方法は一般に書かれています。
public enum sqltypeenum {insert( "inserting")、delete( "delete from")......省略;プライベート文字列名; //カスタム変数を定義するprivate sqltypeenum(string name){this.name = name; } public string getname(){return name; } public string toString(){return name + "i dash"; // toStringメソッドを書き直す} //一般的に推奨されないpublic void setName(string name){this.name = name; }}呼びかけ:
sqltypeenum sqltypeenum = sqltypeenum.valueof( "insert"); system.out.println(sqltypeenum); system.out.println(sqltypeenum.getName());
それを呼ぶことはお勧めしません:
sqltypeenum.setname( "damn");
別のスレッド:
sqltypeenum sqltypeenum = sqltypeenum.valueof( "insert"); system.out.println(sqltypeenum); system.out.println(sqltypeenum.getName());
結果が変更されたことがわかりました、ハハ!