Enums in interfaces java

How to implement an Interface using an Enum in Java

Enumerations serve the purpose of representing a group of named constants in a programming language. For example, the 4 suits in a deck of playing cards may be 4 enumerators named Club, Diamond, Heart, and Spade, belonging to an enumerated type named Suit. We have already discussed the basics of enum, how its declared in the previous article. In this article, we will understand how an enum implements an interface.

We primarily use enums when a method parameter can only take the value out of a small set of possible values means the input values are fixed and it takes from that fixed set of values. Java enum type is a special kind of java class which can contain constants and methods like normal java classes where the values are the only possible instances of this class. This enum extends the abstract class java.lang.Enum. Consider a situation when we have to implement some business logic which is tightly coupled with a discriminatory property of a given object or class at that time we implement an interface with enum. Think about a case where we need to merge the values of two enums into one group and treat them similarly, there Enum implements the interface.

Since an enum is implicitly extending the abstract class java.lang.Enum, it can not extend any other class or enum and also any class can not extend enum. So it’s clear that enum can not extend or can not be extended. But when there is a need to achieve multiple inheritance enum can implement any interface and in java, it is possible that an enum can implement an interface. Therefore, in order to achieve extensibility, the following steps are followed:

The following is the code which demonstrates the implementation of an interface in an enum:

Источник

Java Enum implementing an Interface

Some developers are not aware of this fact but we can implement Interfaces with Enums in Java. This may be useful when we need to implement some business logic that is tightly coupled with a discriminatory property of a given object or class. In this tutorial we will see how to do it and also go through an example use case.

The Enum

In this example we will implement a mathematical operation. The type of the operation (or the operator) will be defined as an Enum. Following next is the operator interface:

package com.byteslounge.enums; public interface Operator

Now we define a Enum that implements this interface. In this example we will only consider the sum and the subtraction operators.

package com.byteslounge.enums; public enum EOperator implements Operator < SUM < @Override public int calculate(int firstOperand, int secondOperand) < return firstOperand + secondOperand; >>, SUBTRACT < @Override public int calculate(int firstOperand, int secondOperand) < return firstOperand - secondOperand; >>; >

The operation class

Now let’s define the Operation class:

package com.byteslounge.enums; public class Operation < private int firstOperand; private int secondOperand; private EOperator operator; public Operation(int firstOperand, int secondOperand, EOperator operator) < this.firstOperand = firstOperand; this.secondOperand = secondOperand; this.operator = operator; >public int calculate() < return operator.calculate(firstOperand, secondOperand); >>

The firstOperand and secondOperand properties represent the members of the operation. The result of the operation will depend on the operator Enum type property. For the result calculation we will invoke calculate method that is implemented by the Enum itself (operator.calculate(firstOperand, secondOperand)).

Читайте также:  Threads and exception handling in java

Testing

Let’s define a simple class to test our example:

package com.byteslounge.enums; public class Main < public static void main (String [] args)< Operation sum = new Operation(10, 5, EOperator.SUM); Operation subtraction = new Operation(10, 5, EOperator.SUBTRACT); System.out.println("Sum: " + sum.calculate()); System.out.println("Subtraction: " + subtraction.calculate()); >>

When we run this test the following output will be generated:

This example source code is available for download at the end of this page.

Download source code from this article

Comments

Gonçalo Marques is a Software Engineer with several years of experience in software development and architecture definition. During this period his main focus was delivering software solutions in banking, telecommunications and governmental areas. He created the Bytes Lounge website with one ultimate goal: share his knowledge with the software development community. His main area of expertise is Java and open source.

He is also the author of the WiFi File Browser Android application:

Источник

Can Enum implements an interface in Java?

Yes, Enum implements an interface in Java, it can be useful when we need to implement some business logic that is tightly coupled with a discriminatory property of a given object or class. An Enum is a special datatype which is added in Java 1.5 version. The Enums are constants, by default they are static and final so the names of an enum type fields are in uppercase letters.

Example

interface EnumInterface < int calculate(int first, int second); >enum EnumClassOperator implements EnumInterface < // An Enum implements an interface ADD < @Override public int calculate(int first, int second) < return first + second; >>, SUBTRACT < @Override public int calculate(int first, int second) < return first - second; >>; > class Operation < private int first, second; private EnumClassOperator operator; public Operation(int first, int second, EnumClassOperator operator) < this.first = first; this.second = second; this.operator = operator; >public int calculate() < return operator.calculate(first, second); >> // Main Class public class EnumTest < public static void main (String [] args) < Operation add = new Operation(20, 10, EnumClassOperator.ADD); Operation subtract = new Operation(20, 10, EnumClassOperator.SUBTRACT); System.out.println("Addition: " + add.calculate()); System.out.println("Subtraction: " + subtract.calculate()); > >

Output

Addition: 30 Subtraction: 10

Источник

Что такое перечисления в Java? (java enum)

Перечисление или java enum – это набор именованных констант, который помогает в определении своих собственных типов данных. Когда вы можете определить тип переменных в программе, становится легко их определить.

Перечисление – это в основном список именованных констант. В Java это определяет тип класса. Он может иметь конструкторы, методы и переменные экземпляра. Он создается с помощью ключевого слова enum. По умолчанию каждая константа перечисления имеет вид.

Хотя перечисление определяет тип класса и имеет конструкторы, вам не нужно создавать экземпляр перечисления с помощью новой переменной. Переменные перечисления используются и объявляются так же, как переменные примитива.

Объявление enum может быть сделано вне Класса или внутри Класса. Но мы не можем объявить Enum внутри метода. Давайте рассмотрим небольшой пример, чтобы понять его декларацию.

1. Объявление перечисления в Java вне класса

enum Directions < // enum keyword is used instead of class keyword NORTH, SOUTH, EAST, WEST; >public class enumDeclaration < public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>

2. Объявление перечисления в Java внутри класса

public class enumDeclaration < enum Directions< NORTH, SOUTH, EAST, WEST; >public static void main(String[] args) < Directions d1 = Directions.EAST; // new keyword is not required to create a new object reference System.out.println(d1); >>

Первая строка внутри типа enum должна быть списком констант. Затем вы можете использовать методы, переменные и конструктор. По сути, enum представляет группу переменных и констант.

  • Enum в Java в основном улучшает безопасность типов.
  • Его можно по-разному использовать в примерах переключения.
  • Enum может быть легко пройден.
  • Перечисление имеет поля, конструкторы и методы.
  • Enum в основном реализует много интерфейсов, но не может расширять какой-либо класс, потому что он внутренне расширяет класс Enum.
Читайте также:  Карликовый сетчатый питон размеры

Перечисление с использованием оператора Switch

Значение перечисления также может использоваться для управления оператором switch. Необходимо, чтобы все операторы case использовали константы из того же перечисления, что и оператор switch. Ниже пример демонстрирует то же самое.

package Edureka; import java.util.*; enum Directions < NORTH, SOUTH, EAST, WEST >public class Test1< public static void main(String[] args) < Directions d= Directions.SOUTH; switch(d) < //The name of the enumertion constants are used without their enumeration case NORTH: //only constants defined under enum Directions can be used System.out.println("North direction"); break; case SOUTH: System.out.println("South direction"); break; case EAST: System.out.println("East directiion"); break; case WEST: System.out.println("West directiion"); break; >

Values() и метод ValueOf()

Values(): при создании enum компилятор Java внутренне добавляет метод values(). Этот метод возвращает массив, содержащий все значения перечисления.

public static enum-type[ ] values()

ValueOf(): этот метод используется для возврата константы перечисления, значение которой равно строке, переданной в качестве аргумента при вызове этого метода.

public static enum-type valueOf (String str)

Теперь давайте напишем программу, чтобы понять эти методы более подробно.

All constants of enum type Colors are: black red blue pink white I Like red

Вот как вы можете использовать метод Values(), чтобы вернуть массив, содержащий все перечисления, присутствующие в методе, и Valueof(), чтобы вернуть константу перечисления.

Перечисление с помощью конструктора, переменной экземпляра и метода

По сути, перечисление может содержать конструктор и выполняется отдельно для каждой константы перечисления во время загрузки класса перечисления. Кроме того, перечисление может создавать конкретные методы.

enum Student < mack(11), Birdie(10), Son(13), Victor(9); private int age; //variable defined in enum Student int getage < return age; >//method defined in enum Student public Student(int age) //constructor defined in enum < this.age= age; >> class EnumDemo < public static void main( String args[] ) < Student S; System.out.println("Age of Victor is " +Student.Victor.getage()+ "years"); >>

Здесь, как только мы объявляем переменную enum(), конструктор вызывается один раз, и он инициализирует параметр age для каждой константы перечисления значениями, указанными в скобках.

Что нужно знать?

1). Перечисления в Java являются типобезопасными и имеют собственное пространство имен. Это означает, что ваше перечисление будет иметь тип, например «Валюта» в приведенном ниже примере, и вы не можете присвоить какое-либо значение, кроме указанного в константах перечисления.

public enum Currency < PENNY, NICKLE, DIME, QUARTER >; Currency coin = Currency.PENNY; coin = 1; //compilation error

2). Enum в Java – это ссылочные типы, такие как класс или интерфейс, и вы можете определить конструктор, методы и переменные внутри, что делает его более мощным, чем Enum в C и C ++, как показано в следующем примере.

3). Вы можете указать значения констант перечисления во время создания, как показано в примере ниже:

Но для этого вам необходимо определить переменную-член и конструктор, потому что PENNY (1) фактически вызывает конструктор, который принимает значение int, см. Пример ниже.

Конструктор должен быть закрытым, любой другой модификатор доступа приведет к ошибке компиляции. Теперь, чтобы получить значение, связанное с каждой монетой, вы можете определить общедоступный метод getValue() внутри перечисления Java, как любой обычный класс. Кроме того, точка с запятой в первой строке не обязательна.

Читайте также:  Перевести php в доллары

4) Константы перечисления неявно статичны и окончательны и не могут быть изменены после создания. Например, приведенный ниже код приведет к ошибке компиляции:

Currency.PENNY = Currency.DIME;

Последнее поле EnumExamples.Currency.PENNY нельзя переназначить.

5) Может использоваться в качестве аргумента в операторе switch и с «case:», например, с примитивным типом int или char. Эта особенность делает их очень полезными для операций переключения. Давайте посмотрим, как использовать enum внутри оператора switch:

Currency usCoin = Currency.DIME; switch (usCoin)

Поскольку константы, определенные внутри Enum, являются окончательными, вы можете безопасно сравнивать их, используя «==», оператор равенства, как показано в следующем примере:

Currency usCoin = Currency.DIME; if(usCoin == Currency.DIME)< System.out.println("enum in java can be compared using = EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="eclipse">for(Currency coin: Currency.values()) < System.out.println("coin: " + coin); >And it will print: coin: PENNY coin: NICKLE coin: DIME coin: QUARTER

8). Он также может переопределять методы. Давайте посмотрим на пример переопределения метода toString() внутри Enum, чтобы предоставить содержательное описание для констант перечислений.

public enum Currency < . @Override public String toString() < switch (this) < case PENNY: System.out.println("Penny: " + value); break; case NICKLE: System.out.println("Nickle: " + value); break; case DIME: System.out.println("Dime: " + value); break; case QUARTER: System.out.println("Quarter: " + value); >return super.toString(); > >;

А вот как это выглядит при отображении:

Currency usCoin = Currency.DIME; System.out.println(usCoin); Output: Dime: 10

9). Два новых класса коллекции EnumMap и EnumSet добавлены в пакет коллекции для поддержки. Эти классы представляют собой высокопроизводительную реализацию интерфейса Map and Set в Java, и мы должны использовать их всякий раз, когда есть возможность.

EnumSet не имеет общедоступного конструктора, вместо этого он предоставляет фабричные методы для создания экземпляра, например. EnumSet.of() методы. Этот дизайн позволяет EnumSet внутренне выбирать между двумя различными реализациями в зависимости от размера констант.

Если Enum имеет менее 64 констант, чем EnumSet использует класс RegularEnumSet, который внутренне использует длинную переменную для хранения этих 64 констант, а если Enum имеет больше ключей, чем 64, то он использует JumboEnumSet.

10). Вы не можете создать экземпляр перечислений с помощью оператора new в Java, потому что конструктор может быть только частным, а константы Enums могут быть созданы только внутри него самого.

11). Экземпляр создается, когда какие-либо константы Enum сначала вызываются или упоминаются в коде.

12). Может реализовать интерфейс и переопределить любой метод, такой как обычный класс. Также стоит отметить, что Enum в Java неявно реализует как Serializable, так и Comparable интерфейс. Давайте посмотрим и пример того, как реализовать интерфейс:

public enum Currency implements Runnable < PENNY(1), NICKLE(5), DIME(10), QUARTER(25); private int value; . @Override public void run() < System.out.println("Enum in Java implement interfaces"); >>

13). Вы можете определить абстрактные методы внутри Enum, а также можете предоставить другую реализацию для разных экземпляров. Давайте посмотрим на пример использования абстрактного метода внутри.

public enum Currency < PENNY(1) < @Override public String color() < return "copper"; >>, NICKLE(5) < @Override public String color() < return "bronze"; >>, DIME(10) < @Override public String color() < return "silver"; >>, QUARTER(25) < @Override public String color() < return "silver"; >>; private int value; public abstract String color(); private Currency(int value) < this.value = value; >>

В этом примере, поскольку каждая монета будет иметь разный цвет, мы сделали метод color() абстрактным и позволили каждому экземпляру Enum определять свой собственный цвет. Вы можете получить цвет любой монеты, просто вызвав метод color(), как показано в примере ниже:

System.out.println("Color: " + Currency.DIME.color());

Средняя оценка 4.7 / 5. Количество голосов: 25

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Видим, что вы не нашли ответ на свой вопрос.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Источник

Оцените статью