-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathenums.html
More file actions
718 lines (575 loc) · 154 KB
/
enums.html
File metadata and controls
718 lines (575 loc) · 154 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Java - Enums</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="description" content="Declaring and using a basic enum, Enums with constructors, Enums with Abstract Methods, Implements Interface, Implement Singleton pattern with a single-element enum, Using methods and static blocks, Documenting enums, Enum as a bounded type parameter, Enum constant specific body, Zero instance enum, Getting the values of an enum, Enum Polymorphism Pattern, Compare and Contains for Enum values, Get enum constant by name, Enum with properties (fields), Convert enum to String, Enums with static fields">
<meta property="og:site_name" content="DevTut">
<meta property="og:title" content="Java - Enums">
<meta property="og:description" content="Declaring and using a basic enum, Enums with constructors, Enums with Abstract Methods, Implements Interface, Implement Singleton pattern with a single-element enum, Using methods and static blocks, Documenting enums, Enum as a bounded type parameter, Enum constant specific body, Zero instance enum, Getting the values of an enum, Enum Polymorphism Pattern, Compare and Contains for Enum values, Get enum constant by name, Enum with properties (fields), Convert enum to String, Enums with static fields">
<meta property="og:type" content="article">
<meta property="og:url" content="/java/enums.html">
<meta property="og:image" content="/logo.png">
<meta name="twitter:title" content="Java - Enums">
<meta name="twitter:description" content="Declaring and using a basic enum, Enums with constructors, Enums with Abstract Methods, Implements Interface, Implement Singleton pattern with a single-element enum, Using methods and static blocks, Documenting enums, Enum as a bounded type parameter, Enum constant specific body, Zero instance enum, Getting the values of an enum, Enum Polymorphism Pattern, Compare and Contains for Enum values, Get enum constant by name, Enum with properties (fields), Convert enum to String, Enums with static fields">
<meta name="twitter:url" content="/java/enums.html">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/logo.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-TileImage" content="/mstile-150x150.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="google-site-verification" content="76_rKXgwMVIjd-axJC_1zPV9OS4mEjvtgjYOWVkAdnQ">
<link rel="preload" href="/assets/css/0.styles.60619e34.css" as="style"><link rel="preload" href="/assets/js/app.1779e102.js" as="script"><link rel="preload" href="/assets/js/3.2cfa8016.js" as="script"><link rel="preload" href="/assets/js/1563.9c9c8179.js" as="script">
<link rel="stylesheet" href="/assets/css/0.styles.60619e34.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">DevTut</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Java</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/java/" aria-current="page" class="sidebar-link">Disclaimer</a></li><li><a href="/java/java-editions-versions-releases-and-distributions.html" class="sidebar-link">Java Editions, Versions, Releases and Distributions</a></li><li><a href="/java/installing-java-standard-edition.html" class="sidebar-link">Installing Java (Standard Edition)</a></li><li><a href="/java/getting-started-with-java-language.html" class="sidebar-link">Getting started with Java Language</a></li><li><a href="/java/type-conversion.html" class="sidebar-link">Type Conversion</a></li><li><a href="/java/getters-and-setters.html" class="sidebar-link">Getters and Setters</a></li><li><a href="/java/reference-data-types.html" class="sidebar-link">Reference Data Types</a></li><li><a href="/java/java-compiler-javac.html" class="sidebar-link">Java Compiler - 'javac'</a></li><li><a href="/java/documenting-java-code.html" class="sidebar-link">Documenting Java Code</a></li><li><a href="/java/command-line-argument-processing.html" class="sidebar-link">Command line Argument Processing</a></li><li><a href="/java/the-java-command-java-and-javaw.html" class="sidebar-link">The Java Command - 'java' and 'javaw'</a></li><li><a href="/java/literals.html" class="sidebar-link">Literals</a></li><li><a href="/java/primitive-data-types.html" class="sidebar-link">Primitive Data Types</a></li><li><a href="/java/strings.html" class="sidebar-link">Strings</a></li><li><a href="/java/stringbuffer.html" class="sidebar-link">StringBuffer</a></li><li><a href="/java/stringbuilder.html" class="sidebar-link">StringBuilder</a></li><li><a href="/java/string-tokenizer.html" class="sidebar-link">String Tokenizer</a></li><li><a href="/java/splitting-a-string-into-fixed-length-parts.html" class="sidebar-link">Splitting a string into fixed length parts</a></li><li><a href="/java/date-class.html" class="sidebar-link">Date Class</a></li><li><a href="/java/dates-and-time-java-time.html" class="sidebar-link">Dates and Time (java.time.*)</a></li><li><a href="/java/localtime.html" class="sidebar-link">LocalTime</a></li><li><a href="/java/bigdecimal.html" class="sidebar-link">BigDecimal</a></li><li><a href="/java/biginteger.html" class="sidebar-link">BigInteger</a></li><li><a href="/java/numberformat.html" class="sidebar-link">NumberFormat</a></li><li><a href="/java/bit-manipulation.html" class="sidebar-link">Bit Manipulation</a></li><li><a href="/java/arrays.html" class="sidebar-link">Arrays</a></li><li><a href="/java/collections.html" class="sidebar-link">Collections</a></li><li><a href="/java/lists.html" class="sidebar-link">Lists</a></li><li><a href="/java/sets.html" class="sidebar-link">Sets</a></li><li><a href="/java/list-vs-set.html" class="sidebar-link">List vs SET</a></li><li><a href="/java/maps.html" class="sidebar-link">Maps</a></li><li><a href="/java/linkedhashmap.html" class="sidebar-link">LinkedHashMap</a></li><li><a href="/java/weakhashmap.html" class="sidebar-link">WeakHashMap</a></li><li><a href="/java/sortedmap.html" class="sidebar-link">SortedMap</a></li><li><a href="/java/treemap-and-treeset.html" class="sidebar-link">TreeMap and TreeSet</a></li><li><a href="/java/queues-and-deques.html" class="sidebar-link">Queues and Deques</a></li><li><a href="/java/dequeue-interface.html" class="sidebar-link">Dequeue Interface</a></li><li><a href="/java/enums.html" aria-current="page" class="active sidebar-link">Enums</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/java/enums.html#declaring-and-using-a-basic-enum" class="sidebar-link">Declaring and using a basic enum</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enums-with-constructors" class="sidebar-link">Enums with constructors</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enums-with-abstract-methods" class="sidebar-link">Enums with Abstract Methods</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#implements-interface" class="sidebar-link">Implements Interface</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#implement-singleton-pattern-with-a-single-element-enum" class="sidebar-link">Implement Singleton pattern with a single-element enum</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#using-methods-and-static-blocks" class="sidebar-link">Using methods and static blocks</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#documenting-enums" class="sidebar-link">Documenting enums</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enum-as-a-bounded-type-parameter" class="sidebar-link">Enum as a bounded type parameter</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enum-constant-specific-body" class="sidebar-link">Enum constant specific body</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#zero-instance-enum" class="sidebar-link">Zero instance enum</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#getting-the-values-of-an-enum" class="sidebar-link">Getting the values of an enum</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enum-polymorphism-pattern" class="sidebar-link">Enum Polymorphism Pattern</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#compare-and-contains-for-enum-values" class="sidebar-link">Compare and Contains for Enum values</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#get-enum-constant-by-name" class="sidebar-link">Get enum constant by name</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enum-with-properties-fields" class="sidebar-link">Enum with properties (fields)</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#convert-enum-to-string" class="sidebar-link">Convert enum to String</a></li><li class="sidebar-sub-header"><a href="/java/enums.html#enums-with-static-fields" class="sidebar-link">Enums with static fields</a></li></ul></li><li><a href="/java/enum-map.html" class="sidebar-link">Enum Map</a></li><li><a href="/java/enumset-class.html" class="sidebar-link">EnumSet class</a></li><li><a href="/java/enum-starting-with-number.html" class="sidebar-link">Enum starting with number</a></li><li><a href="/java/hashtable.html" class="sidebar-link">Hashtable</a></li><li><a href="/java/operators.html" class="sidebar-link">Operators</a></li><li><a href="/java/constructors.html" class="sidebar-link">Constructors</a></li><li><a href="/java/object-class-methods-and-constructor.html" class="sidebar-link">Object Class Methods and Constructor</a></li><li><a href="/java/annotations.html" class="sidebar-link">Annotations</a></li><li><a href="/java/immutable-class.html" class="sidebar-link">Immutable Class</a></li><li><a href="/java/immutable-objects.html" class="sidebar-link">Immutable Objects</a></li><li><a href="/java/visibility-controlling-access-to-members-of-a-class.html" class="sidebar-link">Visibility (controlling access to members of a class)</a></li><li><a href="/java/generics.html" class="sidebar-link">Generics</a></li><li><a href="/java/classes-and-objects.html" class="sidebar-link">Classes and Objects</a></li><li><a href="/java/local-inner-class.html" class="sidebar-link">Local Inner Class</a></li><li><a href="/java/nested-and-inner-classes.html" class="sidebar-link">Nested and Inner Classes</a></li><li><a href="/java/the-java-util-objects-class.html" class="sidebar-link">The java.util.Objects Class</a></li><li><a href="/java/default-methods.html" class="sidebar-link">Default Methods</a></li><li><a href="/java/packages.html" class="sidebar-link">Packages</a></li><li><a href="/java/inheritance.html" class="sidebar-link">Inheritance</a></li><li><a href="/java/reference-types.html" class="sidebar-link">Reference Types</a></li><li><a href="/java/console-i-o.html" class="sidebar-link">Console I/O</a></li><li><a href="/java/streams.html" class="sidebar-link">Streams</a></li><li><a href="/java/inputstreams-and-outputstreams.html" class="sidebar-link">InputStreams and OutputStreams</a></li><li><a href="/java/readers-and-writers.html" class="sidebar-link">Readers and Writers</a></li><li><a href="/java/preferences.html" class="sidebar-link">Preferences</a></li><li><a href="/java/collection-factory-methods.html" class="sidebar-link">Collection Factory Methods</a></li><li><a href="/java/alternative-collections.html" class="sidebar-link">Alternative Collections</a></li><li><a href="/java/concurrent-collections.html" class="sidebar-link">Concurrent Collections</a></li><li><a href="/java/choosing-collections.html" class="sidebar-link">Choosing Collections</a></li><li><a href="/java/super-keyword.html" class="sidebar-link">super keyword</a></li><li><a href="/java/serialization.html" class="sidebar-link">Serialization</a></li><li><a href="/java/optional.html" class="sidebar-link">Optional</a></li><li><a href="/java/object-references.html" class="sidebar-link">Object References</a></li><li><a href="/java/exceptions-and-exception-handling.html" class="sidebar-link">Exceptions and exception handling</a></li><li><a href="/java/calendar-and-its-subclasses.html" class="sidebar-link">Calendar and its Subclasses</a></li><li><a href="/java/using-the-static-keyword.html" class="sidebar-link">Using the static keyword</a></li><li><a href="/java/properties-class.html" class="sidebar-link">Properties Class</a></li><li><a href="/java/lambda-expressions.html" class="sidebar-link">Lambda Expressions</a></li><li><a href="/java/basic-control-structures.html" class="sidebar-link">Basic Control Structures</a></li><li><a href="/java/bufferedwriter.html" class="sidebar-link">BufferedWriter</a></li><li><a href="/java/new-file-i-o.html" class="sidebar-link">New File I/O</a></li><li><a href="/java/file-i-o.html" class="sidebar-link">File I/O</a></li><li><a href="/java/scanner.html" class="sidebar-link">Scanner</a></li><li><a href="/java/interfaces.html" class="sidebar-link">Interfaces</a></li><li><a href="/java/regular-expressions.html" class="sidebar-link">Regular Expressions</a></li><li><a href="/java/comparable-and-comparator.html" class="sidebar-link">Comparable and Comparator</a></li><li><a href="/java/java-floating-point-operations.html" class="sidebar-link">Java Floating Point Operations</a></li><li><a href="/java/currency-and-money.html" class="sidebar-link">Currency and Money</a></li><li><a href="/java/object-cloning.html" class="sidebar-link">Object Cloning</a></li><li><a href="/java/recursion.html" class="sidebar-link">Recursion</a></li><li><a href="/java/converting-to-and-from-strings.html" class="sidebar-link">Converting to and from Strings</a></li><li><a href="/java/random-number-generation.html" class="sidebar-link">Random Number Generation</a></li><li><a href="/java/singletons.html" class="sidebar-link">Singletons</a></li><li><a href="/java/autoboxing.html" class="sidebar-link">Autoboxing</a></li><li><a href="/java/2d-graphics-in-java.html" class="sidebar-link">2D Graphics in Java</a></li><li><a href="/java/jaxb.html" class="sidebar-link">JAXB</a></li><li><a href="/java/class-java-reflection.html" class="sidebar-link">Class - Java Reflection</a></li><li><a href="/java/networking.html" class="sidebar-link">Networking</a></li><li><a href="/java/nio-networking.html" class="sidebar-link">NIO - Networking</a></li><li><a href="/java/httpurlconnection.html" class="sidebar-link">HttpURLConnection</a></li><li><a href="/java/jax-ws.html" class="sidebar-link">JAX-WS</a></li><li><a href="/java/nashorn-javascript-engine.html" class="sidebar-link">Nashorn JavaScript engine</a></li><li><a href="/java/java-native-interface.html" class="sidebar-link">Java Native Interface</a></li><li><a href="/java/functional-interfaces.html" class="sidebar-link">Functional Interfaces</a></li><li><a href="/java/fluent-interface.html" class="sidebar-link">Fluent Interface</a></li><li><a href="/java/remote-method-invocation-rmi.html" class="sidebar-link">Remote Method Invocation (RMI)</a></li><li><a href="/java/iterator-and-iterable.html" class="sidebar-link">Iterator and Iterable</a></li><li><a href="/java/reflection-api.html" class="sidebar-link">Reflection API</a></li><li><a href="/java/bytebuffer.html" class="sidebar-link">ByteBuffer</a></li><li><a href="/java/applets.html" class="sidebar-link">Applets</a></li><li><a href="/java/expressions.html" class="sidebar-link">Expressions</a></li><li><a href="/java/json-in-java.html" class="sidebar-link">JSON in Java</a></li><li><a href="/java/xml-parsing-using-the-jaxp-apis.html" class="sidebar-link">XML Parsing using the JAXP APIs</a></li><li><a href="/java/xml-xpath-evaluation.html" class="sidebar-link">XML XPath Evaluation</a></li><li><a href="/java/xom-xml-object-model.html" class="sidebar-link">XOM - XML Object Model</a></li><li><a href="/java/polymorphism.html" class="sidebar-link">Polymorphism</a></li><li><a href="/java/encapsulation.html" class="sidebar-link">Encapsulation</a></li><li><a href="/java/java-agents.html" class="sidebar-link">Java Agents</a></li><li><a href="/java/varargs-variable-argument.html" class="sidebar-link">Varargs (Variable Argument)</a></li><li><a href="/java/logging-java-util-logging.html" class="sidebar-link">Logging (java.util.logging)</a></li><li><a href="/java/log4j-log4j2.html" class="sidebar-link">log4j / log4j2</a></li><li><a href="/java/oracle-official-code-standard.html" class="sidebar-link">Oracle Official Code Standard</a></li><li><a href="/java/character-encoding.html" class="sidebar-link">Character encoding</a></li><li><a href="/java/apache-commons-lang.html" class="sidebar-link">Apache Commons Lang</a></li><li><a href="/java/localization-and-internationalization.html" class="sidebar-link">Localization and Internationalization</a></li><li><a href="/java/parallel-programming-with-fork-join-framework.html" class="sidebar-link">Parallel programming with Fork/Join framework</a></li><li><a href="/java/non-access-modifiers.html" class="sidebar-link">Non-Access Modifiers</a></li><li><a href="/java/process.html" class="sidebar-link">Process</a></li><li><a href="/java/java-native-access.html" class="sidebar-link">Java Native Access</a></li><li><a href="/java/modules.html" class="sidebar-link">Modules</a></li><li><a href="/java/concurrent-programming-threads.html" class="sidebar-link">Concurrent Programming (Threads)</a></li><li><a href="/java/executor-executorservice-and-thread-pools.html" class="sidebar-link">Executor, ExecutorService and Thread pools</a></li><li><a href="/java/threadlocal.html" class="sidebar-link">ThreadLocal</a></li><li><a href="/java/using-threadpoolexecutor-in-multithreaded-applications.html" class="sidebar-link">Using ThreadPoolExecutor in MultiThreaded applications.</a></li><li><a href="/java/common-java-pitfalls.html" class="sidebar-link">Common Java Pitfalls</a></li><li><a href="/java/java-pitfalls-exception-usage.html" class="sidebar-link">Java Pitfalls - Exception usage</a></li><li><a href="/java/java-pitfalls-language-syntax.html" class="sidebar-link">Java Pitfalls - Language syntax</a></li><li><a href="/java/java-pitfalls-threads-and-concurrency.html" class="sidebar-link">Java Pitfalls - Threads and Concurrency</a></li><li><a href="/java/java-pitfalls-nulls-and-nullpointerexception.html" class="sidebar-link">Java Pitfalls - Nulls and NullPointerException</a></li><li><a href="/java/java-pitfalls-performance-issues.html" class="sidebar-link">Java Pitfalls - Performance Issues</a></li><li><a href="/java/serviceloader.html" class="sidebar-link">ServiceLoader</a></li><li><a href="/java/classloaders.html" class="sidebar-link">Classloaders</a></li><li><a href="/java/creating-images-programmatically.html" class="sidebar-link">Creating Images Programmatically</a></li><li><a href="/java/atomic-types.html" class="sidebar-link">Atomic Types</a></li><li><a href="/java/rsa-encryption.html" class="sidebar-link">RSA Encryption</a></li><li><a href="/java/secure-objects.html" class="sidebar-link">Secure objects</a></li><li><a href="/java/security-cryptography.html" class="sidebar-link">Security & Cryptography</a></li><li><a href="/java/securitymanager.html" class="sidebar-link">SecurityManager</a></li><li><a href="/java/jndi.html" class="sidebar-link">JNDI</a></li><li><a href="/java/sun-misc-unsafe.html" class="sidebar-link">sun.misc.Unsafe</a></li><li><a href="/java/java-memory-model.html" class="sidebar-link">Java Memory Model</a></li><li><a href="/java/java-deployment.html" class="sidebar-link">Java deployment</a></li><li><a href="/java/java-plugin-system-implementations.html" class="sidebar-link">Java plugin system implementations</a></li><li><a href="/java/javabean.html" class="sidebar-link">JavaBean</a></li><li><a href="/java/java-se-7-features.html" class="sidebar-link">Java SE 7 Features</a></li><li><a href="/java/java-se-8-features.html" class="sidebar-link">Java SE 8 Features</a></li><li><a href="/java/dynamic-method-dispatch.html" class="sidebar-link">Dynamic Method Dispatch</a></li><li><a href="/java/generating-java-code.html" class="sidebar-link">Generating Java Code</a></li><li><a href="/java/jshell.html" class="sidebar-link">JShell</a></li><li><a href="/java/stack-walking-api.html" class="sidebar-link">Stack-Walking API</a></li><li><a href="/java/sockets.html" class="sidebar-link">Sockets</a></li><li><a href="/java/java-sockets.html" class="sidebar-link">Java Sockets</a></li><li><a href="/java/ftp-file-transfer-protocol.html" class="sidebar-link">FTP (File Transfer Protocol)</a></li><li><a href="/java/using-other-scripting-languages-in-java.html" class="sidebar-link">Using Other Scripting Languages in Java</a></li><li><a href="/java/c-comparison.html" class="sidebar-link">C++ Comparison</a></li><li><a href="/java/audio.html" class="sidebar-link">Audio</a></li><li><a href="/java/java-print-service.html" class="sidebar-link">Java Print Service</a></li><li><a href="/java/completablefuture.html" class="sidebar-link">CompletableFuture</a></li><li><a href="/java/runtime-commands.html" class="sidebar-link">Runtime Commands</a></li><li><a href="/java/unit-testing.html" class="sidebar-link">Unit Testing</a></li><li><a href="/java/asserting.html" class="sidebar-link">Asserting</a></li><li><a href="/java/multi-release-jar-files.html" class="sidebar-link">Multi-Release JAR Files</a></li><li><a href="/java/just-in-time-jit-compiler.html" class="sidebar-link">Just in Time (JIT) compiler</a></li><li><a href="/java/bytecode-modification.html" class="sidebar-link">Bytecode Modification</a></li><li><a href="/java/disassembling-and-decompiling.html" class="sidebar-link">Disassembling and Decompiling</a></li><li><a href="/java/jmx.html" class="sidebar-link">JMX</a></li><li><a href="/java/java-virtual-machine-jvm.html" class="sidebar-link">Java Virtual Machine (JVM)</a></li><li><a href="/java/xjc.html" class="sidebar-link">XJC</a></li><li><a href="/java/jvm-flags.html" class="sidebar-link">JVM Flags</a></li><li><a href="/java/jvm-tool-interface.html" class="sidebar-link">JVM Tool Interface</a></li><li><a href="/java/java-memory-management.html" class="sidebar-link">Java Memory Management</a></li><li><a href="/java/java-performance-tuning.html" class="sidebar-link">Java Performance Tuning</a></li><li><a href="/java/benchmarks.html" class="sidebar-link">Benchmarks</a></li><li><a href="/java/fileupload-to-aws.html" class="sidebar-link">FileUpload to AWS</a></li><li><a href="/java/appdynamics-and-tibco-businessworks-instrumentation-for-easy-integration.html" class="sidebar-link">AppDynamics and TIBCO BusinessWorks Instrumentation for Easy Integration</a></li><li><a href="/java/the-classpath.html" class="sidebar-link">The Classpath</a></li><li><a href="/java/resources-on-classpath.html" class="sidebar-link">Resources (on classpath)</a></li><li><a href="/java/contributors.html" class="sidebar-link">The Contributors</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="enums"><a href="#enums" class="header-anchor">#</a> Enums</h1> <h2 id="declaring-and-using-a-basic-enum"><a href="#declaring-and-using-a-basic-enum" class="header-anchor">#</a> Declaring and using a basic enum</h2> <p><a href="https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank" rel="noopener noreferrer">Enum<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> can be considered to be syntax sugar for a sealed class that is instantiated only a number of times known at compile-time to define a set of constants.</p> <p>A simple enum to list the different seasons would be declared as follows:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Season</span> <span class="token punctuation">{</span>
WINTER<span class="token punctuation">,</span>
SPRING<span class="token punctuation">,</span>
SUMMER<span class="token punctuation">,</span>
FALL
<span class="token punctuation">}</span>
</code></pre></div><p>While the enum constants don't necessarily need to be in all-caps, it is Java convention that names of constants are entirely uppercase, with words separated by underscores.</p> <p>You can declare an Enum in its own file:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">/**
* This enum is declared in the Season.java file.
*/</span>
<span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Season</span> <span class="token punctuation">{</span>
WINTER<span class="token punctuation">,</span>
SPRING<span class="token punctuation">,</span>
SUMMER<span class="token punctuation">,</span>
FALL
<span class="token punctuation">}</span>
</code></pre></div><p>But you can also declare it inside another class:</p> <div class="language- extra-class"><pre class="language-text"><code>
public class Day {
private Season season;
public String getSeason() {
return season.name();
}
public void setSeason(String season) {
this.season = Season.valueOf(season);
}
/**
* This enum is declared inside the Day.java file and
* cannot be accessed outside because it's declared as private.
*/
private enum Season {
WINTER,
SPRING,
SUMMER,
FALL
}
}
</code></pre></div><p>Finally, you cannot declare an Enum inside a method body or constructor:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Day</span> <span class="token punctuation">{</span>
<span class="token comment">/**
* Constructor
*/</span>
<span class="token keyword">public</span> <span class="token class-name">Day</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// Illegal. Compilation error</span>
<span class="token keyword">enum</span> <span class="token class-name">Season</span> <span class="token punctuation">{</span>
WINTER<span class="token punctuation">,</span>
SPRING<span class="token punctuation">,</span>
SUMMER<span class="token punctuation">,</span>
FALL
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">aSimpleMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// Legal. You can declare a primitive (or an Object) inside a method. Compile!</span>
<span class="token keyword">int</span> primitiveInt <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span>
<span class="token comment">// Illegal. Compilation error.</span>
<span class="token keyword">enum</span> <span class="token class-name">Season</span> <span class="token punctuation">{</span>
WINTER<span class="token punctuation">,</span>
SPRING<span class="token punctuation">,</span>
SUMMER<span class="token punctuation">,</span>
FALL
<span class="token punctuation">}</span>
<span class="token class-name">Season</span> season <span class="token operator">=</span> <span class="token class-name">Season</span><span class="token punctuation">.</span>SPRING<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Duplicate enum constants are not allowed:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Season</span> <span class="token punctuation">{</span>
WINTER<span class="token punctuation">,</span>
WINTER<span class="token punctuation">,</span> <span class="token comment">//Compile Time Error : Duplicate Constants</span>
SPRING<span class="token punctuation">,</span>
SUMMER<span class="token punctuation">,</span>
FALL
<span class="token punctuation">}</span>
</code></pre></div><p>Every constant of enum is <strong><code>public</code>, <code>static</code></strong> and <strong><code>final</code></strong> by default. As every constant is <code>static</code>, they can be accessed directly using the enum name.</p> <p>Enum constants can be passed around as method parameters:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">display</span><span class="token punctuation">(</span><span class="token class-name">Season</span> s<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// name() is a built-in method that gets the exact name of the enum constant</span>
<span class="token punctuation">}</span>
<span class="token function">display</span><span class="token punctuation">(</span><span class="token class-name">Season</span><span class="token punctuation">.</span>WINTER<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Prints out "WINTER"</span>
</code></pre></div><p>You can get an array of the enum constants using the <code>values()</code> method. The values are guaranteed to be in declaration order in the returned array:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Season</span><span class="token punctuation">[</span><span class="token punctuation">]</span> seasons <span class="token operator">=</span> <span class="token class-name">Season</span><span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><p><strong>Note: this method allocates a new array of values each time it is called.</strong></p> <p>To iterate over the enum constants:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">enumIterate</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Season</span> s <span class="token operator">:</span> <span class="token class-name">Season</span><span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>s<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>You can use enums in a <code>switch</code> statement:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">enumSwitchExample</span><span class="token punctuation">(</span><span class="token class-name">Season</span> s<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">switch</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> WINTER<span class="token operator">:</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"It's pretty cold"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SPRING<span class="token operator">:</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"It's warming up"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> SUMMER<span class="token operator">:</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"It's pretty hot"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">case</span> FALL<span class="token operator">:</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"It's cooling down"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>You can also compare enum constants using <code>==</code>:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Season</span><span class="token punctuation">.</span>FALL <span class="token operator">==</span> <span class="token class-name">Season</span><span class="token punctuation">.</span>WINTER <span class="token comment">// false</span>
<span class="token class-name">Season</span><span class="token punctuation">.</span>SPRING <span class="token operator">==</span> <span class="token class-name">Season</span><span class="token punctuation">.</span>SPRING <span class="token comment">// true</span>
</code></pre></div><p>Another way to compare enum constants is by using <code>equals()</code> as below, which is considered bad practice as you can easily fall into pitfalls as follows:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Season</span><span class="token punctuation">.</span>FALL<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token class-name">Season</span><span class="token punctuation">.</span>FALL<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
<span class="token class-name">Season</span><span class="token punctuation">.</span>FALL<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token class-name">Season</span><span class="token punctuation">.</span>WINTER<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false</span>
<span class="token class-name">Season</span><span class="token punctuation">.</span>FALL<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token string">"FALL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false and no compiler error</span>
</code></pre></div><p>Furthermore, although the set of instances in the <code>enum</code> cannot be changed at run-time, the instances themselves are not inherently immutable because like any other class, an <code>enum</code> can contain mutable fields as is demonstrated below.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">MutableExample</span> <span class="token punctuation">{</span>
<span class="token class-name">A</span><span class="token punctuation">,</span>
<span class="token class-name">B</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
count<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"The count of "</span> <span class="token operator">+</span> <span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" is "</span> <span class="token operator">+</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">// Usage:</span>
<span class="token class-name">MutableExample<span class="token punctuation">.</span>A</span><span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs 0</span>
<span class="token class-name">MutableExample<span class="token punctuation">.</span>A</span><span class="token punctuation">.</span><span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">MutableExample<span class="token punctuation">.</span>A</span><span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs 1 -- we've changed a field </span>
<span class="token class-name">MutableExample<span class="token punctuation">.</span>B</span><span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Outputs 0 -- another instance remains unchanged</span>
</code></pre></div><p>However, a good practice is to make <code>enum</code> instances immutable, i.e. when they either don't have any additional fields or all such fields are marked as <code>final</code> and are immutable themselves. This will ensure that for a lifetime of the application an <code>enum</code> won't leak any memory and that it is safe to use its instances across all threads.</p> <p>Enums implicitly implement <code>Serializable</code> and <code>Comparable</code> because the <code>Enum</code> class does:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Enum</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">E</span> <span class="token keyword">extends</span> <span class="token class-name">Enum</span><span class="token punctuation"><</span><span class="token class-name">E</span><span class="token punctuation">></span><span class="token punctuation">></span></span>
<span class="token keyword">extends</span> <span class="token class-name">Object</span>
<span class="token keyword">implements</span> <span class="token class-name">Comparable</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">E</span><span class="token punctuation">></span></span><span class="token punctuation">,</span> <span class="token class-name">Serializable</span>
</code></pre></div><h2 id="enums-with-constructors"><a href="#enums-with-constructors" class="header-anchor">#</a> Enums with constructors</h2> <p>An <code>enum</code> cannot have a public constructor; however, private constructors are acceptable (constructors for enums are <a href="http://stackoverflow.com/documentation/java/134/visibility-controlling-access-to-members-of-a-class/520/package-visibility#t=201609151811172109684" target="_blank" rel="noopener noreferrer">package-private<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> by default):</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Coin</span> <span class="token punctuation">{</span>
<span class="token function">PENNY</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">NICKEL</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">DIME</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">QUARTER</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// usual names for US coins</span>
<span class="token comment">// note that the above parentheses and the constructor arguments match</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> p <span class="token operator">=</span> <span class="token class-name">Coin</span><span class="token punctuation">.</span>NICKEL<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// the int value will be 5</span>
</code></pre></div><p>It is recommended that you keep all fields private and provide getter methods, as there are a finite number of instances for an enum.</p> <p>If you were to implement an <code>Enum</code> as a <code>class</code> instead, it would look like this:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Coin</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span> <span class="token keyword">extends</span> <span class="token class-name">Coin</span><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token keyword">implements</span> <span class="token class-name">Comparable</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span></span><span class="token punctuation">,</span> <span class="token class-name">Serializable</span><span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Coin</span> PENNY <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Coin</span> NICKEL <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Coin</span> DIME <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Coin</span> QUARTER <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> p <span class="token operator">=</span> <span class="token class-name">Coin</span><span class="token punctuation">.</span>NICKEL<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// the int value will be 5</span>
</code></pre></div><p>Enum constants are technically mutable, so a setter could be added to change the internal structure of an enum constant. However, this is considered very bad practice and should be avoided.</p> <p>Best practice is to make Enum fields immutable, with <code>final</code>:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Coin</span> <span class="token punctuation">{</span>
<span class="token function">PENNY</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">NICKEL</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">DIME</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">QUARTER</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">}</span>
</code></pre></div><p>You may define multiple constructors in the same enum. When you do, the arguments you pass in your enum declaration decide which constructor is called:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Coin</span> <span class="token punctuation">{</span>
<span class="token function">PENNY</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">NICKEL</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">DIME</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">QUARTER</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token keyword">boolean</span> isCopperColored<span class="token punctuation">;</span>
<span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">(</span>value<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">,</span> <span class="token keyword">boolean</span> isCopperColored<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>isCopperColored <span class="token operator">=</span> isCopperColored<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Note: All non-primitive enum fields should implement <a href="https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html" target="_blank" rel="noopener noreferrer"><code>Serializable</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> because the <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html" target="_blank" rel="noopener noreferrer"><code>Enum</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> class does.</p> <h2 id="enums-with-abstract-methods"><a href="#enums-with-abstract-methods" class="header-anchor">#</a> Enums with Abstract Methods</h2> <p>Enums can define abstract methods, which each <code>enum</code> member is required to implement.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Action</span> <span class="token punctuation">{</span>
DODGE <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token class-name">Player</span> player<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> player<span class="token punctuation">.</span><span class="token function">isAttacking</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
ATTACK <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token class-name">Player</span> player<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> player<span class="token punctuation">.</span><span class="token function">hasWeapon</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
JUMP <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token class-name">Player</span> player<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> player<span class="token punctuation">.</span><span class="token function">getCoordinates</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Coordinates</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">abstract</span> <span class="token keyword">boolean</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token class-name">Player</span> player<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>This allows for each enum member to define its own behaviour for a given operation, without having to switch on types in a method in the top-level definition.</p> <p>Note that this pattern is a short form of what is typically achieved using polymorphism and/or implementing interfaces.</p> <h2 id="implements-interface"><a href="#implements-interface" class="header-anchor">#</a> Implements Interface</h2> <p>This is an <code>enum</code> that is also a callable function that tests <code>String</code> inputs against precompiled regular expression patterns.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>function<span class="token punctuation">.</span></span><span class="token class-name">Predicate</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>regex<span class="token punctuation">.</span></span><span class="token class-name">Pattern</span><span class="token punctuation">;</span>
<span class="token keyword">enum</span> <span class="token class-name">RegEx</span> <span class="token keyword">implements</span> <span class="token class-name">Predicate</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>
<span class="token function">UPPER</span><span class="token punctuation">(</span><span class="token string">"[A-Z]+"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">LOWER</span><span class="token punctuation">(</span><span class="token string">"[a-z]+"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">NUMERIC</span><span class="token punctuation">(</span><span class="token string">"[+-]?[0-9]+"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">Pattern</span> pattern<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">RegEx</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token class-name">String</span> pattern<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>pattern <span class="token operator">=</span> <span class="token class-name">Pattern</span><span class="token punctuation">.</span><span class="token function">compile</span><span class="token punctuation">(</span>pattern<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token class-name">String</span> input<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>pattern<span class="token punctuation">.</span><span class="token function">matcher</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">matches</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">RegEx</span><span class="token punctuation">.</span>UPPER<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token string">"ABC"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">RegEx</span><span class="token punctuation">.</span>LOWER<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token string">"abc"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">RegEx</span><span class="token punctuation">.</span>NUMERIC<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token string">"+111"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Each member of the enum can also implement the method:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>function<span class="token punctuation">.</span></span><span class="token class-name">Predicate</span><span class="token punctuation">;</span>
<span class="token keyword">enum</span> <span class="token class-name">Acceptor</span> <span class="token keyword">implements</span> <span class="token class-name">Predicate</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>
NULL <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token class-name">String</span> s<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> s <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
EMPTY <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token class-name">String</span> s<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> s<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
NULL_OR_EMPTY <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token class-name">String</span> s<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> NULL<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span> <span class="token operator">||</span> EMPTY<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Acceptor</span><span class="token punctuation">.</span>NULL<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Acceptor</span><span class="token punctuation">.</span>EMPTY<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Acceptor</span><span class="token punctuation">.</span>NULL_OR_EMPTY<span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="implement-singleton-pattern-with-a-single-element-enum"><a href="#implement-singleton-pattern-with-a-single-element-enum" class="header-anchor">#</a> Implement Singleton pattern with a single-element enum</h2> <p>Enum constants are instantiated when an enum is referenced for the first time. Therefore, that allows to implement <a href="http://stackoverflow.com/documentation/java/130/singletons" target="_blank" rel="noopener noreferrer">Singleton<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> software design pattern with a single-element enum.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Attendant</span> <span class="token punctuation">{</span>
INSTANCE<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Attendant</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// perform some initialization routine</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Attendant</span><span class="token punctuation">.</span>INSTANCE<span class="token punctuation">.</span><span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// instantiated at this point</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>According to "Effective Java" book by Joshua Bloch, a single-element enum is the best way to implement a singleton. This approach has following advantages:</p> <ul><li>thread safety</li> <li>guarantee of single instantiation</li> <li>out-of-the-box serialization</li></ul> <p>And as shown in the section <a href="http://stackoverflow.com/documentation/java/155/enums/1809/implements-interface" target="_blank" rel="noopener noreferrer">implements interface<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> this singleton might also implement one or more interfaces.</p> <h2 id="using-methods-and-static-blocks"><a href="#using-methods-and-static-blocks" class="header-anchor">#</a> Using methods and static blocks</h2> <p>An enum can contain a method, just like any class. To see how this works, we'll declare an enum like this:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Direction</span> <span class="token punctuation">{</span>
NORTH<span class="token punctuation">,</span> SOUTH<span class="token punctuation">,</span> EAST<span class="token punctuation">,</span> WEST<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Let's have a method that returns the enum in the opposite direction:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Direction</span> <span class="token punctuation">{</span>
NORTH<span class="token punctuation">,</span> SOUTH<span class="token punctuation">,</span> EAST<span class="token punctuation">,</span> WEST<span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token class-name">Direction</span> <span class="token function">getOpposite</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">switch</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">case</span> NORTH<span class="token operator">:</span>
<span class="token keyword">return</span> SOUTH<span class="token punctuation">;</span>
<span class="token keyword">case</span> SOUTH<span class="token operator">:</span>
<span class="token keyword">return</span> NORTH<span class="token punctuation">;</span>
<span class="token keyword">case</span> WEST<span class="token operator">:</span>
<span class="token keyword">return</span> EAST<span class="token punctuation">;</span>
<span class="token keyword">case</span> EAST<span class="token operator">:</span>
<span class="token keyword">return</span> WEST<span class="token punctuation">;</span>
<span class="token keyword">default</span><span class="token operator">:</span> <span class="token comment">//This will never happen</span>
<span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>This can be improved further through the use of fields and static initializer blocks:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Direction</span> <span class="token punctuation">{</span>
NORTH<span class="token punctuation">,</span> SOUTH<span class="token punctuation">,</span> EAST<span class="token punctuation">,</span> WEST<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Direction</span> opposite<span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token class-name">Direction</span> <span class="token function">getOpposite</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">return</span> opposite<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">static</span> <span class="token punctuation">{</span>
NORTH<span class="token punctuation">.</span>opposite <span class="token operator">=</span> SOUTH<span class="token punctuation">;</span>
SOUTH<span class="token punctuation">.</span>opposite <span class="token operator">=</span> NORTH<span class="token punctuation">;</span>
WEST<span class="token punctuation">.</span>opposite <span class="token operator">=</span> EAST<span class="token punctuation">;</span>
EAST<span class="token punctuation">.</span>opposite <span class="token operator">=</span> WEST<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>In this example, the opposite direction is stored in a private instance field <code>opposite</code>, which is statically initialized the first time a <code>Direction</code> is used.
In this particular case (because <code>NORTH</code> references <code>SOUTH</code> and conversely), we cannot use <a href="http://stackoverflow.com/documentation/java/155/enums/602/enums-with-constructors#t=201607220740460629821" target="_blank" rel="noopener noreferrer">Enums with constructors<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> here (Constructors <code>NORTH(SOUTH), SOUTH(NORTH), EAST(WEST), WEST(EAST)</code> would be more elegant and would allow <code>opposite</code> to be declared <code>final</code>, but would be self-referential and therefore are not allowed).</p> <h2 id="documenting-enums"><a href="#documenting-enums" class="header-anchor">#</a> Documenting enums</h2> <p>Not always the <code>enum</code> name is clear enough to be understood. To document an <code>enum</code>, use standard javadoc:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">/**
* United States coins
*/</span>
<span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Coins</span> <span class="token punctuation">{</span>
<span class="token comment">/**
* One-cent coin, commonly known as a penny,
* is a unit of currency equaling one-hundredth
* of a United States dollar
*/</span>
<span class="token function">PENNY</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">/**
* A nickel is a five-cent coin equaling
* five-hundredth of a United States dollar
*/</span>
<span class="token function">NICKEL</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">/**
* The dime is a ten-cent coin refers to
* one tenth of a United States dollar
*/</span>
<span class="token function">DIME</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">/**
* The quarter is a US coin worth 25 cents,
* one-fourth of a United States dollar
*/</span>
<span class="token function">QUARTER</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token class-name">Coins</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">return</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><h2 id="enum-as-a-bounded-type-parameter"><a href="#enum-as-a-bounded-type-parameter" class="header-anchor">#</a> Enum as a bounded type parameter</h2> <p>When writing a class with generics in java, it is possible to ensure that the type parameter is an enum. Since all enums extend the <code>Enum</code> class, the following syntax may be used.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Holder</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span> <span class="token keyword">extends</span> <span class="token class-name">Enum</span><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">final</span> <span class="token class-name">T</span> value<span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token class-name">Holder</span><span class="token punctuation">(</span><span class="token class-name">T</span> init<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> init<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>In this example, the type <code>T</code> <strong>must</strong> be an enum.</p> <h2 id="enum-constant-specific-body"><a href="#enum-constant-specific-body" class="header-anchor">#</a> Enum constant specific body</h2> <p>In an <code>enum</code> it is possible to define a specific behavior for a particular constant of the <code>enum</code> which overrides the default behavior of the <code>enum</code>, this technique is known as <strong>constant specific body</strong>.</p> <p>Suppose three piano students - John, Ben and Luke - are defined in an <code>enum</code> named <code>PianoClass</code>, as follows:</p> <div class="language- extra-class"><pre class="language-text"><code>
enum PianoClass {
JOHN, BEN, LUKE;
public String getSex() {
return "Male";
}
public String getLevel() {
return "Beginner";
}
}
</code></pre></div><p>And one day two other students arrive - Rita and Tom - with a sex (Female) and level (Intermediate) that do not match the previous ones:</p> <div class="language- extra-class"><pre class="language-text"><code>
enum PianoClass2 {
JOHN, BEN, LUKE, RITA, TOM;
public String getSex() {
return "Male"; // issue, Rita is a female
}
public String getLevel() {
return "Beginner"; // issue, Tom is an intermediate student
}
}
</code></pre></div><p>so that simply adding the new students to the constant declaration, as follows, is not correct:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">PianoClass2</span> tom <span class="token operator">=</span> <span class="token class-name">PianoClass2</span><span class="token punctuation">.</span>TOM<span class="token punctuation">;</span>
<span class="token class-name">PianoClass2</span> rita <span class="token operator">=</span> <span class="token class-name">PianoClass2</span><span class="token punctuation">.</span>RITA<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>tom<span class="token punctuation">.</span><span class="token function">getLevel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints Beginner -> wrong Tom's not a beginner</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>rita<span class="token punctuation">.</span><span class="token function">getSex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints Male -> wrong Rita's not a male</span>
</code></pre></div><p>It's possible to define a specific behavior for each of the constant, Rita and Tom, which overrides the <code>PianoClass2</code> default behavior as follows:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">PianoClass3</span> <span class="token punctuation">{</span>
JOHN<span class="token punctuation">,</span> BEN<span class="token punctuation">,</span> LUKE<span class="token punctuation">,</span>
RITA <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getSex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"Female"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
TOM <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getLevel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"Intermediate"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getSex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"Male"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getLevel</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token string">"Beginner"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>and now Tom's level and Rita's sex are as they should be:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">PianoClass3</span> tom <span class="token operator">=</span> <span class="token class-name">PianoClass3</span><span class="token punctuation">.</span>TOM<span class="token punctuation">;</span>
<span class="token class-name">PianoClass3</span> rita <span class="token operator">=</span> <span class="token class-name">PianoClass3</span><span class="token punctuation">.</span>RITA<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>tom<span class="token punctuation">.</span><span class="token function">getLevel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints Intermediate</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>rita<span class="token punctuation">.</span><span class="token function">getSex</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints Female</span>
</code></pre></div><p>Another way to define content specific body is by using constructor, for instance:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Friend</span> <span class="token punctuation">{</span>
<span class="token function">MAT</span><span class="token punctuation">(</span><span class="token string">"Male"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token function">JOHN</span><span class="token punctuation">(</span><span class="token string">"Male"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token function">JANE</span><span class="token punctuation">(</span><span class="token string">"Female"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">String</span> gender<span class="token punctuation">;</span>
<span class="token class-name">Friend</span><span class="token punctuation">(</span><span class="token class-name">String</span> gender<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>gender <span class="token operator">=</span> gender<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">getGender</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>gender<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>and usage:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Friend</span> mat <span class="token operator">=</span> <span class="token class-name">Friend</span><span class="token punctuation">.</span>MAT<span class="token punctuation">;</span>
<span class="token class-name">Friend</span> john <span class="token operator">=</span> <span class="token class-name">Friend</span><span class="token punctuation">.</span>JOHN<span class="token punctuation">;</span>
<span class="token class-name">Friend</span> jane <span class="token operator">=</span> <span class="token class-name">Friend</span><span class="token punctuation">.</span>JANE<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>mat<span class="token punctuation">.</span><span class="token function">getGender</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Male</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>john<span class="token punctuation">.</span><span class="token function">getGender</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Male</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jane<span class="token punctuation">.</span><span class="token function">getGender</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Female</span>
</code></pre></div><h2 id="zero-instance-enum"><a href="#zero-instance-enum" class="header-anchor">#</a> Zero instance enum</h2> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Util</span> <span class="token punctuation">{</span>
<span class="token comment">/* No instances */</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">clamp</span><span class="token punctuation">(</span><span class="token keyword">int</span> min<span class="token punctuation">,</span> <span class="token keyword">int</span> max<span class="token punctuation">,</span> <span class="token keyword">int</span> i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token class-name">Math</span><span class="token punctuation">.</span><span class="token function">min</span><span class="token punctuation">(</span><span class="token class-name">Math</span><span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> min<span class="token punctuation">)</span><span class="token punctuation">,</span> max<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// other utility methods...</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Just as <code>enum</code> <a href="http://stackoverflow.com/documentation/java/155/enums/5741/implement-singleton-pattern-with-a-single-element-enum" target="_blank" rel="noopener noreferrer">can be used for singletons<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> (1 instance classes), it can be used for utility classes (0 instance classes). Just make sure to terminate the (empty) list of enum constants with a <code>;</code>.</p> <p>See the question <a href="http://stackoverflow.com/questions/25137490/zero-instance-enum-vs-private-constructors-for-preventing-instantiation" target="_blank" rel="noopener noreferrer">Zero instance enum vs private constructors for preventing instantiation<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> for a discussion on pro's and con's compared to private constructors.</p> <h2 id="getting-the-values-of-an-enum"><a href="#getting-the-values-of-an-enum" class="header-anchor">#</a> Getting the values of an enum</h2> <p>Each enum class contains an implicit static method named <code>values()</code>. This method returns an array containing all values of that enum. You can use this method to iterate over the values. It is important to note however that this method returns a <strong>new</strong> array every time it is called.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Day</span> <span class="token punctuation">{</span>
MONDAY<span class="token punctuation">,</span> TUESDAY<span class="token punctuation">,</span> WEDNESDAY<span class="token punctuation">,</span> THURSDAY<span class="token punctuation">,</span> FRIDAY<span class="token punctuation">,</span> SATURDAY<span class="token punctuation">,</span> SUNDAY<span class="token punctuation">;</span>
<span class="token comment">/**
* Print out all the values in this enum.
*/</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printAllDays</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span><span class="token punctuation">(</span><span class="token class-name">Day</span> day <span class="token operator">:</span> <span class="token class-name">Day</span><span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>day<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>If you need a <code>Set</code> you can use <code>EnumSet.allOf(Day.class)</code> as well.</p> <h2 id="enum-polymorphism-pattern"><a href="#enum-polymorphism-pattern" class="header-anchor">#</a> Enum Polymorphism Pattern</h2> <p>When a method need to accept an "extensible" set of <code>enum</code> values, the programmer can apply polymorphism like on a normal <code>class</code> by creating an interface which will be used anywere where the <code>enum</code>s shall be used:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">interface</span> <span class="token class-name">ExtensibleEnum</span> <span class="token punctuation">{</span>
<span class="token class-name">String</span> <span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>This way, any <code>enum</code> tagged by (implementing) the interface can be used as a parameter, allowing the programmer to create a variable amount of <code>enum</code>s that will be accepted by the method. This can be useful, for example, in APIs where there is a default (unmodifiable) <code>enum</code> and the user of these APIs want to "extend" the <code>enum</code> with more values.</p> <p>A set of default enum values can be defined as follows:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">DefaultValues</span> <span class="token keyword">implements</span> <span class="token class-name">ExtensibleEnum</span> <span class="token punctuation">{</span>
VALUE_ONE<span class="token punctuation">,</span> VALUE_TWO<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Additional values can then be defined like this:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">ExtendedValues</span> <span class="token keyword">implements</span> <span class="token class-name">ExtensibleEnum</span> <span class="token punctuation">{</span>
VALUE_THREE<span class="token punctuation">,</span> VALUE_FOUR<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Sample which shows how to use the enums - note how <code>printEnum()</code> accepts values from both <code>enum</code> types:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">printEnum</span><span class="token punctuation">(</span><span class="token class-name">ExtensibleEnum</span> val<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>val<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">printEnum</span><span class="token punctuation">(</span><span class="token class-name">DefaultValues</span><span class="token punctuation">.</span>VALUE_ONE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// VALUE_ONE</span>
<span class="token function">printEnum</span><span class="token punctuation">(</span><span class="token class-name">DefaultValues</span><span class="token punctuation">.</span>VALUE_TWO<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// VALUE_TWO</span>
<span class="token function">printEnum</span><span class="token punctuation">(</span><span class="token class-name">ExtendedValues</span><span class="token punctuation">.</span>VALUE_THREE<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// VALUE_THREE</span>
<span class="token function">printEnum</span><span class="token punctuation">(</span><span class="token class-name">ExtendedValues</span><span class="token punctuation">.</span>VALUE_FOUR<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// VALUE_FOUR</span>
</code></pre></div><p>Note: This pattern does not prevent you from redefining enum values, which are already defined in one enum, in another enum. These enum values would be different instances then.
Also, it is not possible to use switch-on-enum since all we have is the interface, not the real <code>enum</code>.</p> <h2 id="compare-and-contains-for-enum-values"><a href="#compare-and-contains-for-enum-values" class="header-anchor">#</a> Compare and Contains for Enum values</h2> <p>Enums contains only constants and can be compared directly with <code>==</code>. So, only reference check is needed, no need to use <code>.equals</code> method. Moreover, if <code>.equals</code> used incorrectly, may raise the <code>NullPointerException</code> while that's not the case with <code>==</code> check.</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Day</span> <span class="token punctuation">{</span>
GOOD<span class="token punctuation">,</span> AVERAGE<span class="token punctuation">,</span> WORST<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">Day</span> day <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>day<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token class-name">Day</span><span class="token punctuation">.</span>GOOD<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//NullPointerException!</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Good Day!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>day <span class="token operator">==</span> <span class="token class-name">Day</span><span class="token punctuation">.</span>GOOD<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//Always use == to compare enum</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Good Day!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>To group, complement, range the enum values we have <a href="https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html" target="_blank" rel="noopener noreferrer"><code>EnumSet</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> class which contains different methods.</p> <li>
`EnumSet#range` : To get subset of enum by range defined by two endpoints
</li> <li>
`EnumSet#of` : Set of specific enums without any range. Multiple overloaded `of` methods are there.
</li> <li>
`EnumSet#complementOf` : Set of enum which is complement of enum values provided in method parameter
<div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Page</span> <span class="token punctuation">{</span>
A1<span class="token punctuation">,</span> A2<span class="token punctuation">,</span> A3<span class="token punctuation">,</span> A4<span class="token punctuation">,</span> A5<span class="token punctuation">,</span> A6<span class="token punctuation">,</span> A7<span class="token punctuation">,</span> A8<span class="token punctuation">,</span> A9<span class="token punctuation">,</span> A10
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">EnumSet</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Page</span><span class="token punctuation">></span></span> range <span class="token operator">=</span> <span class="token class-name">EnumSet</span><span class="token punctuation">.</span><span class="token function">range</span><span class="token punctuation">(</span><span class="token class-name">Page</span><span class="token punctuation">.</span>A1<span class="token punctuation">,</span> <span class="token class-name">Page</span><span class="token punctuation">.</span>A5<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>range<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token class-name">Page</span><span class="token punctuation">.</span>A4<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Range contains A4"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token class-name">EnumSet</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Page</span><span class="token punctuation">></span></span> of <span class="token operator">=</span> <span class="token class-name">EnumSet</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token class-name">Page</span><span class="token punctuation">.</span>A1<span class="token punctuation">,</span> <span class="token class-name">Page</span><span class="token punctuation">.</span>A5<span class="token punctuation">,</span> <span class="token class-name">Page</span><span class="token punctuation">.</span>A3<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>of<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token class-name">Page</span><span class="token punctuation">.</span>A1<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Of contains A1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div></li> <h2 id="get-enum-constant-by-name"><a href="#get-enum-constant-by-name" class="header-anchor">#</a> Get enum constant by name</h2> <p>Say we have an enum <code>DayOfWeek</code>:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">DayOfWeek</span> <span class="token punctuation">{</span>
SUNDAY<span class="token punctuation">,</span> MONDAY<span class="token punctuation">,</span> TUESDAY<span class="token punctuation">,</span> WEDNESDAY<span class="token punctuation">,</span> THURSDAY<span class="token punctuation">,</span> FRIDAY<span class="token punctuation">,</span> SATURDAY<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>An enum is compiled with a built-in static <code>valueOf()</code> method which can be used to lookup a constant by its name:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">String</span> dayName <span class="token operator">=</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span>SUNDAY<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">assert</span> dayName<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token string">"SUNDAY"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">DayOfWeek</span> day <span class="token operator">=</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>dayName<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">assert</span> day <span class="token operator">==</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span>SUNDAY<span class="token punctuation">;</span>
</code></pre></div><p>This is also possible using a dynamic enum type:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Class</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">DayOfWeek</span><span class="token punctuation">></span></span> enumType <span class="token operator">=</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">;</span>
<span class="token class-name">DayOfWeek</span> day <span class="token operator">=</span> <span class="token class-name">Enum</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>enumType<span class="token punctuation">,</span> <span class="token string">"SUNDAY"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">assert</span> day <span class="token operator">==</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span>SUNDAY<span class="token punctuation">;</span>
</code></pre></div><p>Both of these <code>valueOf()</code> methods will throw an <code>IllegalArgumentException</code> if the specified enum does not have a constant with a matching name.</p> <p>The Guava library provides a helper method <a href="https://google.github.io/guava/releases/18.0/api/docs/com/google/common/base/Enums.html#getIfPresent(java.lang.Class,%20java.lang.String)" target="_blank" rel="noopener noreferrer"><code>Enums.getIfPresent()</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> that returns a Guava <a href="https://google.github.io/guava/releases/18.0/api/docs/com/google/common/base/Optional.html" target="_blank" rel="noopener noreferrer"><code>Optional</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> to eliminate explicit exception handling:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">DayOfWeek</span> defaultDay <span class="token operator">=</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span>SUNDAY<span class="token punctuation">;</span>
<span class="token class-name">DayOfWeek</span> day <span class="token operator">=</span> <span class="token class-name">Enums</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span><span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token string">"INVALID"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">or</span><span class="token punctuation">(</span>defaultDay<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">assert</span> day <span class="token operator">==</span> <span class="token class-name">DayOfWeek</span><span class="token punctuation">.</span>SUNDAY<span class="token punctuation">;</span>
</code></pre></div><h2 id="enum-with-properties-fields"><a href="#enum-with-properties-fields" class="header-anchor">#</a> Enum with properties (fields)</h2> <p>In case we want to use <code>enum</code> with more information and not just as constant values, and we want to be able to compare two enums.</p> <p>Consider the following example:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Coin</span> <span class="token punctuation">{</span>
<span class="token function">PENNY</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">NICKEL</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">DIME</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">QUARTER</span><span class="token punctuation">(</span><span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token keyword">int</span> value<span class="token punctuation">;</span>
<span class="token class-name">Coin</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">isGreaterThan</span><span class="token punctuation">(</span><span class="token class-name">Coin</span> other<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">></span> other<span class="token punctuation">.</span>value<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Here we defined an <code>Enum</code> called <code>Coin</code> which represent its value. With the method <code>isGreaterThan</code> we can compare two <code>enum</code>s:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Coin</span> penny <span class="token operator">=</span> <span class="token class-name">Coin</span><span class="token punctuation">.</span>PENNY<span class="token punctuation">;</span>
<span class="token class-name">Coin</span> dime <span class="token operator">=</span> <span class="token class-name">Coin</span><span class="token punctuation">.</span>DIME<span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>penny<span class="token punctuation">.</span><span class="token function">isGreaterThan</span><span class="token punctuation">(</span>dime<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints: false</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>dime<span class="token punctuation">.</span><span class="token function">isGreaterThan</span><span class="token punctuation">(</span>penny<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// prints: true</span>
</code></pre></div><h2 id="convert-enum-to-string"><a href="#convert-enum-to-string" class="header-anchor">#</a> Convert enum to String</h2> <p>Sometimes you want to convert your enum to a String, there are two ways to do that.</p> <p>Assume we have:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">enum</span> <span class="token class-name">Fruit</span> <span class="token punctuation">{</span>
APPLE<span class="token punctuation">,</span> ORANGE<span class="token punctuation">,</span> STRAWBERRY<span class="token punctuation">,</span> BANANA<span class="token punctuation">,</span> LEMON<span class="token punctuation">,</span> GRAPE_FRUIT<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><p>So how do we convert something like <code>Fruit.APPLE</code> to <code>"APPLE"</code>?</p> <h3 id="convert-using-name"><a href="#convert-using-name" class="header-anchor">#</a> Convert using <code>name()</code></h3> <p><code>name()</code> is an internal method in <code>enum</code> that returns the <code>String</code> representation of the enum, the return <code>String</code> represents <strong><strong>exactly</strong></strong> how the enum value was defined.</p> <p>For example:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>BANANA<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "BANANA"</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>GRAPE_FRUIT<span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "GRAPE_FRUIT"</span>
</code></pre></div><h3 id="convert-using-tostring"><a href="#convert-using-tostring" class="header-anchor">#</a> Convert using <code>toString()</code></h3> <p><code>toString()</code> is, <strong>by default</strong>, overridden to have the same behavior as <code>name()</code></p> <p>However, <code>toString()</code> is likely overridden by <strong>developers</strong> to make it print a more user friendly <code>String</code></p> <blockquote></blockquote> <p>Don't use `toString()` if you want to do checking in your code, `name()` is much more stable for that.
Only use `toString()` when you are going to output the value to logs or stdout or something</p> <h3 id="by-default"><a href="#by-default" class="header-anchor">#</a> By default:</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>BANANA<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "BANANA"</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>GRAPE_FRUIT<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "GRAPE_FRUIT"</span>
</code></pre></div><h3 id="example-of-being-overridden"><a href="#example-of-being-overridden" class="header-anchor">#</a> Example of being overridden</h3> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>BANANA<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "Banana"</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Fruit</span><span class="token punctuation">.</span>GRAPE_FRUIT<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "Grape Fruit"</span>
</code></pre></div><h2 id="enums-with-static-fields"><a href="#enums-with-static-fields" class="header-anchor">#</a> Enums with static fields</h2> <p>If your enum class is required to have static fields, keep in mind they are created <strong>after</strong> the enum values themselves. That means, the following code will result in a <code>NullPointerException</code>:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Example</span> <span class="token punctuation">{</span>
<span class="token function">ONE</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">TWO</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">></span></span> integers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Example</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
integers<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>A possible way to fix this:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Example</span> <span class="token punctuation">{</span>
<span class="token function">ONE</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">TWO</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">></span></span> integers<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Example</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">putValue</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">putValue</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">,</span> <span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>integers <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
integers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
integers<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>Do not initialize the static field:</p> <div class="language-java extra-class"><pre class="language-java"><code><span class="token keyword">enum</span> <span class="token class-name">Example</span> <span class="token punctuation">{</span>
<span class="token function">ONE</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">TWO</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// after initialisisation integers is null!!</span>
<span class="token keyword">static</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Integer</span><span class="token punctuation">></span></span> integers <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token class-name">Example</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">putValue</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">putValue</span><span class="token punctuation">(</span><span class="token class-name">String</span> name<span class="token punctuation">,</span> <span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>integers <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
integers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
integers<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// !!this may lead to null poiner exception!!</span>
<span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token class-name">Example</span><span class="token punctuation">.</span>integers<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div><p>initialisisation:</p> <li>create the enum values
<ul>
- as side effect putValue() called that initializes integers
<ul><li>integers = null; // is executed after the enums so the content of integers is lost</li></ul> <h4 id="syntax"><a href="#syntax" class="header-anchor">#</a> Syntax</h4> <ul><li>[public/protected/private] enum Enum_name { // Declare a new enum.</li> <li>ENUM_CONSTANT_1[, ENUM_CONSTANT_2...]; // Declare the enum constants. This must be the first line inside of the enum, and should be separated by commas, with a semicolon at the end.</li> <li>ENUM_CONSTANT_1(param)[, ENUM_CONSTANT_2(param)...]; // Declare enum constants with parameters. The parameter types must match the constructor.</li> <li>ENUM_CONSTANT_1 {...}[, ENUM_CONSTANT_2 {...}...]; // Declare enum constants with overridden methods. This must be done if the enum contains abstract methods; all such methods must be implemented.</li> <li>ENUM_CONSTANT.name() // Returns a String with the name of the enum constant.</li> <li>ENUM_CONSTANT.ordinal() // Returns the ordinal of this enumeration constant, its position in its enum declaration, where the initial constant is assigned an ordinal of zero.</li> <li>Enum_name.values() // Returns a new array (of type Enum_name[]) containing every constant of that enum everytime it is called.</li> <li>Enum_name.valueOf("ENUM_CONSTANT") // The inverse of ENUM_CONSTANT.name() -- returns the enum constant with the given name.</li> <li>Enum.valueOf(Enum_name.class, "ENUM_CONSTANT") // A synonym of the previous one: The inverse of ENUM_CONSTANT.name() -- returns the enum constant with the given name.</li></ul> <h4 id="remarks"><a href="#remarks" class="header-anchor">#</a> Remarks</h4> <h3 id="restrictions"><a href="#restrictions" class="header-anchor">#</a> Restrictions</h3> <p>Enums always extend <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html" target="_blank" rel="noopener noreferrer"><code>java.lang.Enum</code><span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>, so it is impossible for an enum to extend a class. However, they can implement many interfaces.</p> <h3 id="tips-tricks"><a href="#tips-tricks" class="header-anchor">#</a> Tips & Tricks</h3> <p>Because of their specialized representation, there are more efficient <a href="https://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.html" target="_blank" rel="noopener noreferrer">maps<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> and <a href="https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html" target="_blank" rel="noopener noreferrer">sets<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> that can be used with enums as their keys. These will often run quicker than their non-specialized counterparts.</p></ul></li></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/devtut/generate/edit/master/docs/java/enums.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
←
<a href="/java/dequeue-interface.html" class="prev">
Dequeue Interface
</a></span> <span class="next"><a href="/java/enum-map.html">
Enum Map
</a>
→
</span></p></div> </main></div><div class="global-ui"><!----></div></div>
<script src="/assets/js/app.1779e102.js" defer></script><script src="/assets/js/3.2cfa8016.js" defer></script><script src="/assets/js/1563.9c9c8179.js" defer></script>
</body>
</html>