讓你的系統更安全--用枚舉enum替代int常量

做應用系統時,我們往往假設用戶是小白,那麼為了保證系統的正常,我們往往會對用戶的參數做限制,並且前後端都要對用戶的參數做驗證。那我們在設計的時候是否可以提前預防這種問題呢?其中的一種方式就是:用枚舉enum替代int常量。

讓你的系統更安全--用枚舉enum替代int常量


枚舉的好處:

1. 類型安全性

2.使用方便性

示例1

public class EnumDemo { 
enum Color{
RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN(28);
private int colorValue;
private Color(int rv){
this.colorValue=rv;
}
private int getColorValue(){
return colorValue;
}

private int value(){
return ordinal()+1;
}
}
public static void main(String[] args) {
for(Color s : Color.values()) {
//enum的values()返回一個數組,這裡就是Seasons[]
System.out.println(s.value()+":"+s.name()+"="+s.getColorValue());
}
}
}

output:

1:RED=3

2:BLUE=5

3:BLACK=8

4:YELLOW=13

5:GREEN=28

其中,

 /**
* Returns the ordinal of this enumeration constant (its position
* in its enum declaration, where the initial constant is assigned
* an ordinal of zero).
*
* Most programmers will have no use for this method. It is
* designed for use by sophisticated enum-based data structures, such
* as {@link java.util.EnumSet} and {@link java.util.EnumMap}.
*
* @return the ordinal of this enumeration constant
*/
public final int ordinal() {
return ordinal;
}

示例2:

EnumMap是專門為枚舉類型量身定做的Map實現。雖然使用其它的Map實現(如HashMap)也能完成枚舉類型實例到值得映射,但是使用EnumMap會更加高效:它只能接收同一枚舉類型的實例作為鍵值,並且由於枚舉類型實例的數量相對固定並且有限,所以EnumMap使用數組來存放與枚舉類型對應的值。這使得EnumMap的效率非常高。

import java.util.*;
public enum Phase {
SOLID, LIQUID, GAS;
public enum Transition {
MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(
GAS, LIQUID), SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
private final Phase src;
private final Phase dst;
Transition(Phase src, Phase dst) {
this.src = src;
this.dst = dst;

}
private static final Map<phase>> m = new EnumMap<phase>>(
Phase.class);
static {
for (Phase p : Phase.values())
m.put(p, new EnumMap<phase>(Phase.class));
for (Transition trans : Transition.values())
m.get(trans.src).put(trans.dst, trans);
}
public static Transition from(Phase src, Phase dst) {
return m.get(src).get(dst);
}
}
public static void main(String[] args) {
for (Phase src : Phase.values())
for (Phase dst : Phase.values())
if (src != dst)
System.out.printf("%s to %s : %s %n", src, dst,
Transition.from(src, dst));
}
}
/<phase>/<phase>/<phase>


分享到:


相關文章: