Enumerated type
Encyclopedia
In computer programming
, an enumerated type (also called enumeration or enum) is a data type
consisting of a set of named values
called elements, members or enumerators of the type. The enumerator names are usually identifier
s that behave as constants
in the language. A variable that has been declared
as having an enumerated type can be assigned any of the enumerators as a value. In other words, an enumerated type has values which are different from each other, and which can be compared and assigned, but which do not have any particular concrete representation in the computer's memory; compilers and interpreters can represent them arbitrarily.
For example, the four suits in a deck of playing cards may be four enumerators named CLUB, DIAMOND, HEART, SPADE, belonging to an enumerated type named suit. If a variable V is declared having suit as its data type, one can assign any of those four values to it.
The enumerators are necessarily distinct, even though some languages may allow the same enumerator to be listed twice in the type's declaration. The enumerators need not be complete or compatible in any sense. For example, an enumerated type called color may be defined to consist of the enumerators RED, GREEN, ZEBRA, MISSING, and BACON. In some languages, the declaration of an enumerated type also defines an ordering
of its members.
Some enumerator types may be built into the language. The Boolean type, for example is often a pre-defined enumeration of the values FALSE and TRUE. Many languages allow the user to define new enumerated types.
Values and variables of an enumerated type are usually implemented as fixed-length bit strings, often in a format and size compatible with some integer
type. Some languages, especially system programming language
s, allow the user to specify the bit combination to be used for each enumerator. In type theory
, enumerated types are often regarded as tagged union
s of unit type
s. Since such types are of the form 1 + 1 + ... + 1, they may also be written as natural numbers.
These arbitrary values were sometimes referred as magic numbers
since there often was no explanation as to how the numbers were obtained or whether their actual values were significant. These magic numbers could make the source code harder for others to understand and maintain.
Enumerated types, on the other hand, made the code more self-documenting. Depending on the language, the compiler could automatically assign default values to the enumerators thereby hiding unnecessary detail from the programmer. These values may not even be visible to the programmer (see information hiding
). Enumerated types can also prevent a programmer from writing illogical code such as performing mathematical operations on the values of the enumerators. If the value of a variable that was assigned an enumerator were to be printed, some programming languages could also print the name of the enumerator rather than its underlying numerical value.
Conceptually speaking, an enumerated type is similar to a list of nominals
, since each possible value of the type is assigned a distinctive natural number. A given enumerated type is thus a concrete implementation of this notion. When order is meaningful and/or used for comparison, then an enumerated type becomes an ordinal
type.
, enumerators are conventionally written with upper case letters to indicate they are constants.
The declaration will often appear in a type synonym declaration, such that it can be used for multiple variables:
The order in which the enumeration values are given matters. An enumerated type is an ordinal type, and the
, provide a special conversion syntax using a method called
decoding and encoding.
Pascal style languages also allow for enumeration to be used as array index
In addition to
Similar to C-style languages Ada allows the internal representation of the enumeration to be specified:
Unlike C-style languages Ada also allows the number of bits of the enumeration to be specified:
Even more, you can use enumerations as indexes for arrays like pascal, but there are attributes defined for enumerations
Like Modula-3
Ada treats
standard for C, which became C89. In C, enumerations are created by explicit definitions, which use the
C exposes the integer representation of enumeration values directly to the programmer. Integers and enum values can be mixed freely, and all arithmetic operations on enum values are permitted. It is even possible for an enum variable to hold an integer that does not represent any of the enumeration values. In fact, according to the language definition, the above code will define
C also allows the programmer to choose the values of the enumeration constants explicitly, even without type. For example,
could be used to define a type that allows mathematical sets of suits to be represented as an
Typeless languages in the syntactic tradition of C (e.g. Perl
or JavaScript
) do not, in general, provide enumerations.
has enumeration types that are directly inherited from C's and work mostly like these, except that an enumeration is a real type in C++, giving additional compile-time checking. Also (as with structs) the C++ "enum" keyword is automatically combined with a "typedef", so that instead of calling the type "enum name", one simply calls it "name." This can be simulated in C using a typedef: "typedef enum {TYPE1, TYPE2} name;"
added enumerated types whose declaration syntax is
similar to that of C
's:
The Java type system, however, treats enumerations as a type separate from integers, and intermixing of enum and integer values is not allowed. In fact, an enum type in Java is actually a special compiler-generated class
rather than an arithmetic type, and enum values behave as global pre-generated instances of that class. Enum types can have instance methods and a constructor (the arguments of which can be specified separately for each enum value). All enum types implicitly extend the abstract class. An enum type cannot be instantiated directly.
Internally, each enum value contains an integer, corresponding to the order in which they are declared in the source code, starting from 0. The programmer cannot set a custom integer for an enum value directly, but one can define overloaded constructors which can then assign arbitrary values to self-defined members of the enum class. Defining getters allows then access to those self-defined members. The internal integer can be obtained from an enum value using the method, and the list of enum values of an enumeration type can be obtained in order using the
The Java standard library provides utility classes to use with enumerations. The class implements a
to an integer and back again, and an enum variable can have values that were not declared by the enum definition. For example, given
the expressions
only has enumerated types for interoperability with C; hence, the semantics is similar to C and, as in C, the enum values are just integers and no further type check is done. The C example from above can be written in Fortran as
(up to version 6) and VBA
are automatically assigned the "
Example Code in vb.Net
languages in the ML
lineage (e.g., SML
, OCaml and Haskell
), an algebraic data type
with only nullary constructor
s can be used to implement an enumerated type. For example (in the syntax of SML signatures):
datatype cardsuit = Clubs | Diamonds | Hearts | Spades
type card = { suit: cardsuit; value: int }
val hand : card list
val trump : cardsuit
In these languages the small-integer representation is completely hidden from the programmer, if indeed such a representation is employed by the implementation. However, Haskell has the
which a type can derive or implement to get a mapping between the type and
uses the member type specifier, e.g.
which states that object is of type cardsuit if it is
parameter specializer,
however. Instead,
Additionally,
may be used to define arbitrary enumerated types at runtime. For instance
would refer to a type equivalent to the prior definition of cardsuit, as of course would simply have been using
but may be less confusing with the function
s support enumerated types directly. MySQL
provides an enumerated type
supports enumerated types through the enumeration facet used for constraining most primitive datatypes such as strings.
Computer programming
Computer programming is the process of designing, writing, testing, debugging, and maintaining the source code of computer programs. This source code is written in one or more programming languages. The purpose of programming is to create a program that performs specific operations or exhibits a...
, an enumerated type (also called enumeration or enum) is a data type
Data type
In computer programming, a data type is a classification identifying one of various types of data, such as floating-point, integer, or Boolean, that determines the possible values for that type; the operations that can be done on values of that type; the meaning of the data; and the way values of...
consisting of a set of named values
Value (computer science)
In computer science, a value is an expression which cannot be evaluated any further . The members of a type are the values of that type. For example, the expression "1 + 2" is not a value as it can be reduced to the expression "3"...
called elements, members or enumerators of the type. The enumerator names are usually identifier
Identifier
An identifier is a name that identifies either a unique object or a unique class of objects, where the "object" or class may be an idea, physical [countable] object , or physical [noncountable] substance...
s that behave as constants
Constant (programming)
In computer programming, a constant is an identifier whose associated value cannot typically be altered by the program during its execution...
in the language. A variable that has been declared
Declaration (computer science)
In programming languages, a declaration specifies the identifier, type, and other aspects of language elements such as variables and functions. It is used to announce the existence of the element to the compiler; this is important in many strongly-typed languages that require variables and their...
as having an enumerated type can be assigned any of the enumerators as a value. In other words, an enumerated type has values which are different from each other, and which can be compared and assigned, but which do not have any particular concrete representation in the computer's memory; compilers and interpreters can represent them arbitrarily.
For example, the four suits in a deck of playing cards may be four enumerators named CLUB, DIAMOND, HEART, SPADE, belonging to an enumerated type named suit. If a variable V is declared having suit as its data type, one can assign any of those four values to it.
The enumerators are necessarily distinct, even though some languages may allow the same enumerator to be listed twice in the type's declaration. The enumerators need not be complete or compatible in any sense. For example, an enumerated type called color may be defined to consist of the enumerators RED, GREEN, ZEBRA, MISSING, and BACON. In some languages, the declaration of an enumerated type also defines an ordering
Total order
In set theory, a total order, linear order, simple order, or ordering is a binary relation on some set X. The relation is transitive, antisymmetric, and total...
of its members.
Some enumerator types may be built into the language. The Boolean type, for example is often a pre-defined enumeration of the values FALSE and TRUE. Many languages allow the user to define new enumerated types.
Values and variables of an enumerated type are usually implemented as fixed-length bit strings, often in a format and size compatible with some integer
Integer (computer science)
In computer science, an integer is a datum of integral data type, a data type which represents some finite subset of the mathematical integers. Integral data types may be of different sizes and may or may not be allowed to contain negative values....
type. Some languages, especially system programming language
System programming language
System programming languages are programming languages that are statically typed, allow arbitrarily complex data structures, are compiled, and are meant to operate largely independently of other programs. Prototypical system programming languages are C and Modula-2...
s, allow the user to specify the bit combination to be used for each enumerator. In type theory
Type theory
In mathematics, logic and computer science, type theory is any of several formal systems that can serve as alternatives to naive set theory, or the study of such formalisms in general...
, enumerated types are often regarded as tagged union
Tagged union
In computer science, a tagged union, also called a variant, variant record, discriminated union, or disjoint union, is a data structure used to hold a value that could take on several different, but fixed types. Only one of the types can be in use at any one time, and a tag field explicitly...
s of unit type
Unit type
In the area of mathematical logic, and computer science known as type theory, a unit type is a type that allows only one value . The carrier associated with a unit type can be any singleton set. There is an isomorphism between any two such sets, so it is customary to talk about the unit type and...
s. Since such types are of the form 1 + 1 + ... + 1, they may also be written as natural numbers.
Rationale
Some early programming languages did not originally have enumerated types. If a programmer wanted a variable, for example myColor, to have a value of red, the variable red would be declared and assigned some arbitrary value, usually an integer constant. The variable red would then be assigned to myColor. Other techniques assigned arbitrary values to strings containing the names of the enumerators.These arbitrary values were sometimes referred as magic numbers
Magic number (programming)
In computer programming, the term magic number has multiple meanings. It could refer to one or more of the following:* A constant numerical or text value used to identify a file format or protocol; for files, see List of file signatures...
since there often was no explanation as to how the numbers were obtained or whether their actual values were significant. These magic numbers could make the source code harder for others to understand and maintain.
Enumerated types, on the other hand, made the code more self-documenting. Depending on the language, the compiler could automatically assign default values to the enumerators thereby hiding unnecessary detail from the programmer. These values may not even be visible to the programmer (see information hiding
Information hiding
In computer science, information hiding is the principle of segregation of the design decisions in a computer program that are most likely to change, thus protecting other parts of the program from extensive modification if the design decision is changed...
). Enumerated types can also prevent a programmer from writing illogical code such as performing mathematical operations on the values of the enumerators. If the value of a variable that was assigned an enumerator were to be printed, some programming languages could also print the name of the enumerator rather than its underlying numerical value.
Conceptually speaking, an enumerated type is similar to a list of nominals
Nominal number
Nominal numbers are numerals used for identification only. The numerical value is irrelevant, and they do not indicate quantity, rank, or any other measurement.-Definition:...
, since each possible value of the type is assigned a distinctive natural number. A given enumerated type is thus a concrete implementation of this notion. When order is meaningful and/or used for comparison, then an enumerated type becomes an ordinal
Ordinal number
In set theory, an ordinal number, or just ordinal, is the order type of a well-ordered set. They are usually identified with hereditarily transitive sets. Ordinals are an extension of the natural numbers different from integers and from cardinals...
type.
Conventions
In some programming conventionsProgramming style
Programming style is a set of rules or guidelines used when writing the source code for a computer program. It is often claimed that following a particular programming style will help programmers to read and understand source code conforming to the style, and help to avoid introducing errors.A...
, enumerators are conventionally written with upper case letters to indicate they are constants.
Pascal and syntactically similar languages
In Pascal, an enumerated type can be implicitly declared by listing the values in a parenthesised list:The declaration will often appear in a type synonym declaration, such that it can be used for multiple variables:
The order in which the enumeration values are given matters. An enumerated type is an ordinal type, and the
pred
and succ
functions will give the prior or next value of the enumeration, and ord
can convert enumeration values to their integer representation. Standard Pascal does not offer a conversion from arithmetic types to enumerations, however. Extended Pascal offers this functionality via an extended succ
function. Some other Pascal dialects allow it via type-casts. Some modern descendants of Pascal, such as Modula-3Modula-3
In computer science, Modula-3 is a programming language conceived as a successor to an upgraded version of Modula-2 known as Modula-2+. While it has been influential in research circles it has not been adopted widely in industry...
, provide a special conversion syntax using a method called
VAL
; Modula-3 also treats BOOLEAN
and CHAR
as special pre-defined enumerated types and uses ORD
and VAL
for standard ASCIIASCII
The American Standard Code for Information Interchange is a character-encoding scheme based on the ordering of the English alphabet. ASCII codes represent text in computers, communications equipment, and other devices that use text...
decoding and encoding.
Pascal style languages also allow for enumeration to be used as array index
Ada
In Ada, the use of "=" was replaced with "is" leaving the definition quite similar:In addition to
Pred
, Succ
, Val
and Pos
Ada also supports simple string conversions via Image
and Value
.Similar to C-style languages Ada allows the internal representation of the enumeration to be specified:
Unlike C-style languages Ada also allows the number of bits of the enumeration to be specified:
Even more, you can use enumerations as indexes for arrays like pascal, but there are attributes defined for enumerations
Like Modula-3
Modula-3
In computer science, Modula-3 is a programming language conceived as a successor to an upgraded version of Modula-2 known as Modula-2+. While it has been influential in research circles it has not been adopted widely in industry...
Ada treats
Boolean
and Character
as special pre-defined (in package "Standard
") enumerated types. Unlike Modula-3 one can also define own character types:C and syntactically similar languages
The original K&R dialect of the C programming language did not have enumerated types, but they were added in the ANSIAnsi
Ansi is a village in Kaarma Parish, Saare County, on the island of Saaremaa, Estonia....
standard for C, which became C89. In C, enumerations are created by explicit definitions, which use the
enum
keyword and are reminiscent of struct and union definitions:C exposes the integer representation of enumeration values directly to the programmer. Integers and enum values can be mixed freely, and all arithmetic operations on enum values are permitted. It is even possible for an enum variable to hold an integer that does not represent any of the enumeration values. In fact, according to the language definition, the above code will define
CLUBS
, DIAMONDS
, HEARTS
, and SPADES
as constants of type int, which will only be converted (silently) to enum cardsuit
if they are stored in a variable of that type.C also allows the programmer to choose the values of the enumeration constants explicitly, even without type. For example,
could be used to define a type that allows mathematical sets of suits to be represented as an
enum cardsuit
by bitwise logic operations.Typeless languages in the syntactic tradition of C (e.g. Perl
Perl
Perl is a high-level, general-purpose, interpreted, dynamic programming language. Perl was originally developed by Larry Wall in 1987 as a general-purpose Unix scripting language to make report processing easier. Since then, it has undergone many changes and revisions and become widely popular...
or JavaScript
JavaScript
JavaScript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. It is a multi-paradigm language, supporting object-oriented, imperative, and functional programming styles....
) do not, in general, provide enumerations.
C++
C++C++
C++ is a statically typed, free-form, multi-paradigm, compiled, general-purpose programming language. It is regarded as an intermediate-level language, as it comprises a combination of both high-level and low-level language features. It was developed by Bjarne Stroustrup starting in 1979 at Bell...
has enumeration types that are directly inherited from C's and work mostly like these, except that an enumeration is a real type in C++, giving additional compile-time checking. Also (as with structs) the C++ "enum" keyword is automatically combined with a "typedef", so that instead of calling the type "enum name", one simply calls it "name." This can be simulated in C using a typedef: "typedef enum {TYPE1, TYPE2} name;"
Java
The J2SE version 5.0 of the Java programming languageJava (programming language)
Java is a programming language originally developed by James Gosling at Sun Microsystems and released in 1995 as a core component of Sun Microsystems' Java platform. The language derives much of its syntax from C and C++ but has a simpler object model and fewer low-level facilities...
added enumerated types whose declaration syntax is
similar to that of C
C (programming language)
C is a general-purpose computer programming language developed between 1969 and 1973 by Dennis Ritchie at the Bell Telephone Laboratories for use with the Unix operating system....
's:
The Java type system, however, treats enumerations as a type separate from integers, and intermixing of enum and integer values is not allowed. In fact, an enum type in Java is actually a special compiler-generated class
Class (computer science)
In object-oriented programming, a class is a construct that is used as a blueprint to create instances of itself – referred to as class instances, class objects, instance objects or simply objects. A class defines constituent members which enable these class instances to have state and behavior...
rather than an arithmetic type, and enum values behave as global pre-generated instances of that class. Enum types can have instance methods and a constructor (the arguments of which can be specified separately for each enum value). All enum types implicitly extend the abstract class. An enum type cannot be instantiated directly.
Internally, each enum value contains an integer, corresponding to the order in which they are declared in the source code, starting from 0. The programmer cannot set a custom integer for an enum value directly, but one can define overloaded constructors which can then assign arbitrary values to self-defined members of the enum class. Defining getters allows then access to those self-defined members. The internal integer can be obtained from an enum value using the method, and the list of enum values of an enumeration type can be obtained in order using the
values
method. It is generally discouraged for programmers to convert enums to integers and vice versa. Enumerated types are Comparable
, using the internal integer; as a result, they can be sorted.The Java standard library provides utility classes to use with enumerations. The class implements a
Set
of enum values; it is implemented as a bit array, which makes it very compact and as efficient as explicit bit manipulation, but safer. The class implements a Map
of enum values to object. It is implemented as an array, with the integer value of the enum value serving as the index.C#
Enumerated types in the C# programming language preserve most of the "small integer" semantics of C's enums. Some arithmetic operations are not defined for enums, but an enum value can be explicitly convertedto an integer and back again, and an enum variable can have values that were not declared by the enum definition. For example, given
the expressions
CardSuit.Diamonds + 1
and CardSuit.Hearts - CardSuit.Clubs
are allowed directly (because it makes sense to step through the sequence of values or ask how many steps there are between two values), but CardSuit.Hearts * CardSuit.Spades
is deemed to make less sense and is only allowed if the values are first converted to integers.Fortran
FortranFortran
Fortran is a general-purpose, procedural, imperative programming language that is especially suited to numeric computation and scientific computing...
only has enumerated types for interoperability with C; hence, the semantics is similar to C and, as in C, the enum values are just integers and no further type check is done. The C example from above can be written in Fortran as
Visual Basic/VBA
Enumerated datatypes in Visual BasicVisual Basic
Visual Basic is the third-generation event-driven programming language and integrated development environment from Microsoft for its COM programming model...
(up to version 6) and VBA
Visual Basic for Applications
Visual Basic for Applications is an implementation of Microsoft's event-driven programming language Visual Basic 6 and its associated integrated development environment , which are built into most Microsoft Office applications...
are automatically assigned the "
Long
" datatype and also become a datatype themselves:Example Code in vb.Net
Algebraic data type in functional programming
In functional programmingFunctional programming
In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It emphasizes the application of functions, in contrast to the imperative programming style, which emphasizes changes in state...
languages in the ML
ML programming language
ML is a general-purpose functional programming language developed by Robin Milner and others in the early 1970s at the University of Edinburgh, whose syntax is inspired by ISWIM...
lineage (e.g., SML
Standard ML
Standard ML is a general-purpose, modular, functional programming language with compile-time type checking and type inference. It is popular among compiler writers and programming language researchers, as well as in the development of theorem provers.SML is a modern descendant of the ML...
, OCaml and Haskell
Haskell (programming language)
Haskell is a standardized, general-purpose purely functional programming language, with non-strict semantics and strong static typing. It is named after logician Haskell Curry. In Haskell, "a function is a first-class citizen" of the programming language. As a functional programming language, the...
), an algebraic data type
Algebraic data type
In computer programming, particularly functional programming and type theory, an algebraic data type is a datatype each of whose values is data from other datatypes wrapped in one of the constructors of the datatype. Any wrapped datum is an argument to the constructor...
with only nullary constructor
Nullary constructor
In computer programming, a nullary constructor is a constructor that takes no arguments.-Object-oriented constructors:In object-oriented programming, a constructor is code that is run when an object is created...
s can be used to implement an enumerated type. For example (in the syntax of SML signatures):
datatype cardsuit = Clubs | Diamonds | Hearts | Spades
type card = { suit: cardsuit; value: int }
val hand : card list
val trump : cardsuit
In these languages the small-integer representation is completely hidden from the programmer, if indeed such a representation is employed by the implementation. However, Haskell has the
Enum
type classType class
In computer science, a type class is a type system construct that supports ad-hoc polymorphism. This is achieved by adding constraints to type variables in parametrically polymorphic types...
which a type can derive or implement to get a mapping between the type and
Int
.Lisp
Common LispCommon Lisp
Common Lisp, commonly abbreviated CL, is a dialect of the Lisp programming language, published in ANSI standard document ANSI INCITS 226-1994 , . From the ANSI Common Lisp standard the Common Lisp HyperSpec has been derived for use with web browsers...
uses the member type specifier, e.g.
which states that object is of type cardsuit if it is
#'eql
to club, diamond, heart or spade. The member type specifier is not valid as a CLOSCLOS
The Common Lisp Object System is the facility for object-oriented programming which is part of ANSI Common Lisp. CLOS is a powerful dynamic object system which differs radically from the OOP facilities found in more static languages such as C++ or Java. CLOS was inspired by earlier Lisp object...
parameter specializer,
however. Instead,
(eql atom)
, which is the equivalent to (member atom)
may be used (that is, only one member of the set may be specified with an eql type specifier, however, it may be used as a CLOS parameter specializer.) In other words, in order to define methods to cover an enumerated type, a method must be defined for each specific element of that type.Additionally,
may be used to define arbitrary enumerated types at runtime. For instance
would refer to a type equivalent to the prior definition of cardsuit, as of course would simply have been using
but may be less confusing with the function
#'member
for stylistic reasons.Databases
Some databaseDatabase
A database is an organized collection of data for one or more purposes, usually in digital form. The data are typically organized to model relevant aspects of reality , in a way that supports processes requiring this information...
s support enumerated types directly. MySQL
MySQL
MySQL officially, but also commonly "My Sequel") is a relational database management system that runs as a server providing multi-user access to a number of databases. It is named after developer Michael Widenius' daughter, My...
provides an enumerated type
ENUM
with allowable values specified as strings when a table is created. The values are stored as numeric indices with the empty string stored as 0, the first string value stored as 1, the second string value stored as 2, etc. Values can be stored and retrieved as numeric indexes or string values.XML
XMLXML
Extensible Markup Language is a set of rules for encoding documents in machine-readable form. It is defined in the XML 1.0 Specification produced by the W3C, and several other related specifications, all gratis open standards....
supports enumerated types through the enumeration facet used for constraining most primitive datatypes such as strings.