I have written an enum class and I want to either get the attribute by type or get the type by attribute, but it seems impossible.
public enum AreaCode {
area1(7927),
area2(7928),
area3(7929);
private final int ac;
AreaCode(int ac) {
this.ac = ac;
}
int areaCode(){
return ac;
}
AreaCode area(int n) {
switch (n) {
case 7927: return AreaCode.area1;
case 7928: return AreaCode.area2;
case 7929: return AreaCode.area3;
}
}
}
The code above will not compile. How to make area(int n)
work?
Enum. GetValues(typeof(FunkyAttributesEnum)); foreach (int value in values) Tuple. Value = Enum. GetName(typeof(FunkyAttributesEnum), value);
An enum can, just like a class , have attributes and methods. The only difference is that enum constants are public , static and final (unchangeable - cannot be overridden).
An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.
Apart from the issues pointed at by the other posters, I'd rewrite the method to avoid duplicating the information (keep it DRY!):
public static AreaCode area(int n) {
for (AreaCode c : values()) {
if (c.ac == n) {
return c;
}
}
// either throw the IAE or return null, your choice.
throw new IllegalArgumentException(String.valueOf(n));
}
As they say, there is more than one way to skin a cat. First off, enum values should be uppercase (words delimited by underscores) as they are constant values and should be treated as such by Java naming conventions. At the very least, they should begin with a capital letter as all class names should.
public enum AreaCode {
AREA_1(7927),
AREA_2(7928),
AREA_3(7929);
private int areaCode;
private AreaCode(int areaCode) {
this.areaCode = areaCode;
}
public int getAreaCode() {
return areaCode;
}
}
Now, there are three ways to retrieve an enum by an instance variable. A switch statement, a loop with an equality condition, and a lookup map. The last scenario may add more memory to your program, but if you need to lookup a lot of enums quickly, this will help you do it at a constant rate O(1) time.
Each of the enum classes below are act identical, but each one does something different internally. By adding the following main()
method to any of these classes, you will get the same result.
public static void main(String[] args) {
System.out.println(retrieveByAreaCode(7928));
}
The example above will print:
AreaCode[name="AREA_2", value="7928"]
Lookup is O(1) (constant time), but you need to hard-code each case (not very dynamic).
public enum AreaCode {
AREA_1(7927),
AREA_2(7928),
AREA_3(7929);
private int areaCode;
private AreaCode(int areaCode) {
this.areaCode = areaCode;
}
public int getAreaCode() {
return areaCode;
}
public static AreaCode retrieveByAreaCode(int n) {
switch (n) {
case 7927:
return AreaCode.AREA_1;
case 7928:
return AreaCode.AREA_2;
case 7929:
return AreaCode.AREA_3;
default:
return null;
}
}
@Override
public String toString() {
return String.format("%s[name=\"%s\", value=\"%d\"]",
this.getClass().getName(), this.name(), this.getAreaCode());
}
}
Lookup is O(n) (linear time), so you need to loop over each value until you find a match, but you do need to hard-code each case (dynamic).
public enum AreaCode {
AREA_1(7927),
AREA_2(7928),
AREA_3(7929);
private int areaCode;
private AreaCode(int areaCode) {
this.areaCode = areaCode;
}
public int getAreaCode() {
return areaCode;
}
public static AreaCode retrieveByAreaCode(int n) {
for (AreaCode areaCode : AreaCode.values()) {
if (areaCode.getAreaCode() == n) {
return areaCode;
}
}
return null;
}
@Override
public String toString() {
return String.format("%s[name=\"%s\", value=\"%d\"]",
this.getClass().getName(), this.name(), this.getAreaCode());
}
}
Lookup is O(1) (constant time), and you do not need to hard-code each value (dynamic), but you need to store the map which takes up memory.
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public enum AreaCode {
AREA_1(7927),
AREA_2(7928),
AREA_3(7929);
private static final Map<Integer, AreaCode> LOOKUP_MAP;
private int areaCode;
static {
LOOKUP_MAP = new HashMap<Integer, AreaCode>();
for (AreaCode areaCode : AreaCode.values()) {
LOOKUP_MAP.put(areaCode.getAreaCode(), areaCode);
}
LOOKUP_MAP = Collections.unmodifiableMap(LOOKUP_MAP);
}
private AreaCode(int areaCode) {
this.areaCode = areaCode;
}
public int getAreaCode() {
return areaCode;
}
public static AreaCode retrieveByAreaCode(int n) {
return LOOKUP_MAP.get(n);
}
@Override
public String toString() {
return String.format("%s[name=\"%s\", value=\"%d\"]",
this.getClass().getName(), this.name(), this.getAreaCode());
}
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class EnumUtils {
public static interface EnumProperty<T extends Enum<T>, U> {
U getValue(T type);
}
public static <T extends Enum<T>, U> Map<U, T> createLookup(Class<T> enumTypeClass, EnumProperty<T, U> prop) {
Map<U, T> lookup = new HashMap<U, T>();
for (T type : enumTypeClass.getEnumConstants()) {
lookup.put(prop.getValue(type), type);
}
return Collections.unmodifiableMap(lookup);
}
}
import java.util.Map;
public enum AreaCode {
AREA_1(7927),
AREA_2(7928),
AREA_3(7929);
private static final EnumUtils.EnumProperty<AreaCode, Integer> ENUM_PROP;
private static final Map<Integer, AreaCode> LOOKUP_MAP;
static {
ENUM_PROP = new EnumUtils.EnumProperty<AreaCode, Integer>() {
@Override
public Integer getValue(AreaCode code) {
return code.getAreaCode();
}
};
LOOKUP_MAP = EnumUtils.createLookup(AreaCode.class, ENUM_PROP);
}
private int areaCode;
private AreaCode(int areaCode) {
this.areaCode = areaCode;
}
public int getAreaCode() {
return areaCode;
}
public static AreaCode retrieveByAreaCode(int n) {
return LOOKUP_MAP.get(n);
}
@Override
public String toString() {
return String.format("%s[name=\"%s\", value=\"%d\"]",
this.getClass().getName(), this.name(), this.getAreaCode());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With