Java列挙型チュートリアル:それは何ですか?それを実装する方法は?



Java Enumチュートリアルに関するこの記事では、理解を深めるための実用的な例とともに、Enum定数の詳細な知識を提供します。

ザ・ の列挙 は、固定定数と名前付き定数を使用してクラスを定義する方法です。 キーワードを使用して 列挙型。 この「 Java列挙型チュートリアル 」の記事、私たちはすることを学びますと一緒に列挙を定義するより良い理解のための例。

列挙とは何ですか?

Java列挙型 変更される傾向のない定数または変数の固定セットを持つクラスです。 Javaでの列挙は、キーワードを使用して実現されます 列挙型。 Java 列挙型 定数は 静的 そして 最後の 暗黙のうちに。列挙機能は、 JDKバージョン1.5。





なぜ列挙が必要なのですか?

列挙型 ボイラープレートコードを回避することにより、コンパイル時のチェック時の型の安全性を向上させ、実行時のエラーを回避します。たとえば、利用可能なオプションの最小数から1つの可能性を選択する必要がある場合、たとえば、

ジョブ タイプ: (契約する / 一時的 / パーマネント)



Java列挙型チュートリアルの従業員

次に、最良のオプションは、 列挙型。 なぜなら 列挙型 スイッチで簡単に使用できます。 列挙型 トラバースできます。 列挙型 できる 持ってる フィールド、コンストラクター、およびメソッド。したがって、、使用が合法である値をすでに文書化しているため、コンパイル時のチェックが増加し、無効な定数を渡すことによるエラーが回避されます。

列挙型とクラスの違い

クラスと列挙型はJava環境で同様の機能を持っていますが、いくつかの点で異なります。違いについて話し合いましょう



列挙型 クラス
列挙型定数はオーバーライドできませんクラス定数はオーバーライドできます
列挙型はオブジェクトの作成をサポートしていませんクラスはオブジェクトの作成をサポートします
列挙型は他のクラスを拡張できませんクラスは他のクラスを拡張できます
列挙型c実装インターフェースクラスはインターフェイスを実装できます


列挙型の実用的な例

ここで、列挙型をよりよく理解するために、以下に基づいていくつかの実用的な例を実行してみましょう。

Javaでの列挙の定義

列挙型は、クラス内またはc外のいずれかで宣言できます。しましょう。ただし、メソッド内で宣言することはできません。その構文、定義、および宣言を理解するために、小さな例を見てみましょう。

構文:

列挙型名{定数}

この例では、 メイン() 方法 内部 列挙型

パッケージ定義publicclass Edureka {enum Level {BAJA、KTM、YAMAHA} public static void main(String [] args){Level myVar = Level.KTM System.out.println(myVar)}}

//出力

KTM

この例では、 メイン() メソッドが宣言されています 外側 列挙型の。

パッケージ定義enumColor {BAJAJ、KTM、YAMAHA} public class Edureka {public static void main(String [] args){Bike b1 = Color.YAMAHA System.out.println(b1)}}

//出力:

ヤマハ

SwitchCaseで使用される列挙型

列挙は、switchステートメントでも使用できます。すべてのcaseステートメントで、switchステートメントで使用されているのと同じ列挙型の定数を使用する必要があることが重要です。これに基づいて例を確認してみましょう。

ここでは、曜日を要素として列挙型を宣言し、データを文字列の形式で渡して、一致するケースのデータを出力します。

パッケージスイッチド列挙型Day {SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY} public class Edureka {Day day public Edureka(Day day){this.day = day} public void dayIsLike(){switch(day){case月曜日:System.out.println( 'こんにちは、今日は月曜日です')ブレークケース火曜日:System.out.println( 'こんにちは、今日は火曜日です')ブレークケース水曜日:System.out.println( 'こんにちは、今日は水曜日です')break case木曜日:System.out.println('こんにちは、今日は木曜日 ')break case金曜日:System.out.println('こんにちは、今日は金曜日です。 ')break case土曜日:System.out.println('こんにちは、今日はあなたの週末です ')break case SUNDAY:System.out.println('こんにちは、今日は休日です ')break default:System.out.println('有効な日を入力してください。 ')break}} public static void main(String [] args){String str = 'MONDAY' Edureka e1 = new Edureka(Day.valueOf(str))e1.dayIsLike()}}

//出力:

こんにちは、今日は月曜

列挙型を使用した継承

基本的に、 列挙型 抽象クラスjava.langを拡張するクラスとして表されます。 列挙型 いくつかの静的メンバーがあります。したがって、 列挙型 他のクラスを拡張できない、または 列挙型 倍数はありません 相続 。より良い方法でそれを理解するために例を実行してみましょう。

ここでは、電話メーカーに基づいてOSを継承します。

パッケージ継承importjava.util.ArrayList import java.util.List public class Edureka {public static void main(String [] args){リストinherit = new ArrayList()inherit.add(LibraryEnum.FIRST)inherit.add(ClientEnum。 google)for(HTTPMethodConvertible element:inherit){System.out.println(element.getHTTPMethodType())}} static interface HTTPMethodConvertible {public String getHTTPMethodType()} static enum LibraryEnumimplements HTTPMethodConvertible {FIRST( 'Google Pixel')、SECOND( 'Huawei')、THIRD( 'Apple 11 Pro')String httpMethodType LibraryEnum(String phone){httpMethodType = phone} public String getHTTPMethodType(){return httpMethodType}} static enumClientEnumはHTTPMethodConvertibleを実装します{huawei( 'HongMing OS')、apple ( 'iOS')、google( 'Android One')String httpMethodType ClientEnum(String s){httpMethodType = s} public String getHTTPMethodType(){return httpMethodType}}}

//出力:

Google Pixel
Android One

カスタマイズされた値を持つ列挙型

列挙型にはデフォルトで独自の文字列値がありますが、いくつかのカスタム値を列挙型に割り当てることもできます。以下の例を考えてみましょう。

列挙型トラフィック{RED( 'STOP')、ORANGE( 'WAIT')、GREEN( 'GO')}

上記の例では、Trafficenumに3つのメンバーがあることがわかります。つまり、

Javaの基本的なデータ構造

赤いオレンジ そして 独自の異なるカスタム値があります やめて、待って そして GO それぞれ。

コードで同じタイプの列挙型を使用するために、次のいくつかのポイントに従うことが期待されています。

  • 作成する必要があります パラメータ化されたコンストラクタ この列挙型クラスの場合。私たちはそれを知っているので 列挙型 クラスのオブジェクトは明示的に作成できないため、初期化にはパラメーター化されたコンストラクターを使用します。
  • ザ・ ビルダー 公開したり保護したりすることはできません 民間 または デフォルト 修飾子。 publicまたはprotectedを作成すると、完全に反対の複数のオブジェクトを初期化できます。 列挙型機能。
  • の値を取得するには、getterメソッドを作成する必要があります 列挙型。

これに基づいてプログラムを実行してみましょう。

パッケージトラフィック列挙型TrafficSignal {RED( 'STOP')、GREEN( 'GO')、ORANGE( 'WAIT')private String action public String getAction(){return this.action} private TrafficSignal(String action){this.action = action}} public class Edureka {public static void main(String args []){TrafficSignal [] signal = TrafficSignal.values()for(TrafficSignal signal:signals){System.out.println( 'name:' + signal.name ()+ 'アクション:' + signal.getAction())}}}

//出力:

名前:赤アクション:停止
名前:GREENアクション:GO
男性e:オレンジアクション:待機

if-else-ifステートメントの列挙型

それでは、に基づいてプログラムを実行しましょう if-else-ifステートメントの列挙型。 ここでは、列挙型で使用可能な方向の値を渡すことにより、トラバースの方向を見つけます。

パッケージDirectionsenum Directions {EAST、WEST、NORTH、SOUTH} public class Edureka {public static void main(String args []){Directions dir = Directions.NORTH if(dir == Directions.EAST){System.out.println( 'Direction:East')} else if(dir == Directions.WEST){System.out.println( 'Direction:West')} else if(dir == Directions.NORTH){System.out.println( 'Direction :北 ')} else {System.out.println('方向:南 ')}}}

//出力:

いう動作:北

列挙型で使用されるさまざまな方法

Values(): 列挙型を作成すると、 Javaコンパイラ 内部的に追加します values() 方法。このメソッドは アレイ 列挙型のすべての値が含まれています。

//構文:

public static enum-type [] values()

配列内の特定の要素のインデックス値を調べます。

パッケージ値enumColor {RED、GREEN、BLUE} public class Edureka {public static void main(String [] args){Color arr [] = Color.values()for(Color col:arr){System.out.println( col + 'インデックス' + col.ordinal())} System.out.println(Color.valueOf( 'RED'))}}

//出力:

インデックス0の赤
インデックス1の緑
インデックス2の青
ネット

ValueOf(): このメソッドは、値がに等しい列挙定数を返すために使用されます このメソッドの呼び出し中に引数として渡されます。

//構文:

public static enum-type valueOf(String str)

ここでは、文字列に渡す入力に基づいて特定の電話のコストを見つけます。

enumMobileのパッケージ値{Samsung(1099)、Apple(1250)、Google(1325)int price Mobile(int p){price = p} int showPrice(){return price}} public class Edureka {public static void main(String args []){System.out.println( 'CellPhone List:')for(Mobile m:Mobile.values()){System.out.println(m + 'costs' + m.showPrice()+ 'dollars' )} Mobile ret ret = Mobile.valueOf( 'Samsung')System.out.println( 'Selected:' + ret)}}

//出力:

サムスンは1099ドルかかります
Appleの価格は1250ドル
Googleの費用は1325ドルです
選択:Samsung

Ordinal(): Javaインタプリタは ordinal() それが作成するときに内部的にメソッド 列挙型。 ordinal()メソッドは インデックス 列挙値の。

//構文:

public final int ordinal()

ここでは、配列内の特定の要素のインデックス値を調べます。また、桜の実の位置。

パッケージの通常のenumフルーツ{Apple、Banana、Cherry、Date、Elderberry} enum Vegetables {Carrot、Beetroot、Beans、Tomato、Onion} public class Edureka {public static void main(String [] args){Fruits [] fru = Fruits。 values()for(Fruits fr:fru){System.out.println(fr + ':' + fr.ordinal())} Fruits f1、f2、f3 f1 = Fruits.Apple f2 = Fruits.Cherry f3 = Fruits.Apple if(f2.compareTo(f1)> 0){System.out.println(f2 + 'は' + f1の後に来る)} Vegetables v1 = Vegetables.Beetroot if(f1.equals(v1)){System.out.println( '不正解 ')}}}

//出力:

アップル:0
バナナ:1
チェリー:2
日付:3
ニワトコ:4
チェリーはアップルの後に来る

列挙型の利点

  • Javaの列挙型が改善されます 型安全性
  • 列挙型はで簡単に使用できるように設計されています スイッチケース
  • 列挙型は 横断した
  • 列挙型は持つことができます フィールド、メソッド、 そして コンストラクター
  • 列挙型は実装できます インターフェイス
  • 列挙型は拡張できません クラス 内部的には拡張するので 列挙型 クラス

列挙型ユースケース:じゃんけんゲーム

我々は使用するだろう 列挙型 私たちの子供時代のゲームを作成するためにJavaで、 ロック(ストーン)ペーパーとはさみ 。次のコードはその方法を説明しています。

パッケージEdurekaimport java.util.Random import java.util.Scanner enum HandSign {SCISSOR、PAPER、STONE} public class SPS {public static void main(String [] args){Random random = new Random()boolean gameOver = false HandSign playerMove = HandSign.SCISSOR HandSign computerMove int numTrials = 0 int numComputerWon = 0 int numPlayerWon = 0 int numTie = 0 Scanner in = new Scanner(System.in)System.out.println( 'nLet us begin ... n')while (!gameOver){System.out.printf( '%nScissor-Paper-Stonen')boolean validInput do {System.out.print( 'nYour turn(sははさみ、pは紙、tは石、q終了する):n ')char inChar = in.next()。toLowerCase()。charAt(0)validInput = true if(inChar ==' q '){gameOver = true} else if(inChar ==' s ' ){playerMove = HandSign.SCISSOR} else if(inChar == 'p'){playerMove = HandSign.PAPER} else if(inChar == 't'){playerMove = HandSign.STONE} else {System.out.println( 'n入力を確認して再試行してください!n')validInput = false}} while(!val idInput)if(!gameOver){int aRandomNumber = random.nextInt(3)if(aRandomNumber == 0){computerMove = HandSign.SCISSOR System.out.println( 'nIt's My turn:SCISSORn')} else if(aRandomNumber = = 0){computerMove = HandSign.PAPER System.out.println( 'nIt's My turn:PAPERn')} else {computerMove = HandSign.STONE System.out.println( 'nIt's My turn:STONEn')} if(computerMove = = playerMove){System.out.println( 'nIt's a Tie!n')++ numTie} else if(computerMove == HandSign.SCISSOR&amp&amp playerMove == HandSign.PAPER){System.out.println( 'nScissorが紙を切る、私は勝ちました!n ')++ numComputerWon} else if(computerMove == HandSign.PAPER&amp&amp playerMove == HandSign.STONE){System.out.println(' nPaper wraps stone、I won!n ')++ numComputerWon} else if(computerMove == HandSign.STONE&amp&amp playerMove == HandSign.SCISSOR){System.out.println( 'nStone breaks scissor、I won!n')++ numComputerWon} else {System.out.println( 'nCongratulations。 ..!勝ちました!n ')++ numPlayerWon} ++ numTrials}} System.out.printf('%n試行回数: '+ numTrials)System.out.printf('勝ちました%d(%。2f %%) 。%d(%。2f %%)。%n '、numComputerWon、100.0 * numComputerWon / numTrials、numPlayerWon、100.0 * numPlayerWon / numTrials)System.out.println(' Bye!、Hope you資産..! ' )}}

//出力:

始めましょう...
シザー-紙-石
あなたの番(はさみの場合はs、紙の場合はp、石の場合はt、終了するにはqを入力してください):
s
それは私の番です:ストーン
石がはさみを壊す、勝った!
シザー-紙-石
あなたの番(はさみの場合はs、紙の場合はp、石の場合はt、終了するにはqを入力してください):

試行回数:1勝1(100.00%)。あなたは0(0.00%)を獲得しました。
さようなら!、楽しんでいただけたでしょうか..!

これで、このJava列挙型チュートリアルは終了です。いくつかのリアルタイムの例を通して、Javaの列挙型とその実装を理解していただければ幸いです。

これで理解できました 列挙型 この「Java列挙型チュートリアル」の基本は、 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 EdurekaのJavaJ2EEおよびSOAトレーニングおよび認定コースは、Java開発者になりたい学生および専門家向けに設計されています。このコースは、Javaプログラミングをすぐに開始できるように設計されており、HibernateやHibernateなどのさまざまなJavaフレームワークに加えて、コアと高度なJavaの両方の概念についてトレーニングします。

質問がありますか?この「Java列挙型チュートリアル」ブログのコメントセクションで言及してください。できるだけ早くご連絡いたします。