91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Effective Java —— 枚舉篇 精華總結

發布時間:2020-07-12 07:23:01 來源:網絡 閱讀:410 作者:星恒Android 欄目:移動開發
JAVA推薦使用枚舉代替int

1 枚舉提供了類型安全檢測
2 枚舉隔離了使用的類和枚舉類型,使增加和重排無需重新編譯
3 本質上是單元素枚舉,final類型,不支持擴展(繼承),但是可以自由使用接口和方法。
4 便于理解,維護
5 絕對安全的單例類型(相對于雙重鎖,無法被反序列化創造多個實例)

Android 不建議使用枚舉的原因

1 手機內存資源有限,ENUM將會增大最終的DEX文件,大約是Integer常量的13倍,大量使用會影響程序性能。
2 虛擬機加載枚舉類,并且實例化所有的枚舉項,并且這些枚舉實例的內存無法回收,而且枚舉是單例,如果自定義的枚舉類中包含了大塊內存的引用,也可能會帶來內存泄露。

實例域代替系數

永遠不要根據枚舉的序數導出與它關聯的值(ordinal()方法雖然從0開始,但是當常量重排序時會混亂),而是要將它保存在一個實例域中:

public enum Ensemble {

SOLO(1), DUET(2), TRIO(3),  QUARTET(4), QUINTET(5),

private final int numberOfMusicians;

Ensemble(int size ) { this.numberOfMusicians = size; }

public int numberOfMusicians() { return numberOfMusicians;}

}
EnumSet代替位域

位域:text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

位域表示的缺陷:位域以數字形式打印時,翻譯位域比翻譯簡單的int枚舉常量要困難得多;要遍歷位域表示的所有元素也沒有很容易的方法。

EnumSet:

public class Text {
    public enum Style {BOLD , ITALIC , UNDERLINE , STRIKETHROUGH}

// Any Set could be passed in , but EnumSet is clearly best

public void applyStyles(Set<Style> styles) { ... }
}

使用:text.applyStyles(EnumSet.of(Style.BOLD , Style.ITALIC));

EnumSet缺點:即截止Java 1.6發行版本,他都無法創建不可變的EnumSet,但是這一點很可能在即將出現的版本中得到修正。同時,可以用Collections.unmodifiableSet將EnumSet封裝起來,但是間接性和性能會受到影響。

用EnumMap代替序數索引

EnumMap優點:
1 結構清晰,如果用索引,無法知道索引與對應集合的關系)
2 安全,相對于索引作為key,當修改對應集合時,如果未修改索引可能引發重大問題。

示例:

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, Map<Phase, Transition>> m =
                new EnumMap<Phase, Map<Phase, Transition>>(Phase.class);
        static {
            for(Phase p : Phase.values())
                m.put(p, new EnumMap<Phase, Transition>(Phase.class));
            for(Transition t : Transition.values())
                m.get(t.src).put(t.dst, t);
        }

        public static Transition from(Phase src, Phase dst) {
            return m.get(src).get(dst);
        }
    }
}
用接口模擬可伸縮的枚舉

枚舉為final,無法通過繼承擴展,但可以使用接口方式擴展

public interface Operation {
    double apply(double x,double y);
}

public enum BasicOperation implements Operation {   
    PLUS("+"){      
        public double apply(double x, double y) {           
            return x + y;
        }
    },
    MINUS("-"){ 
        public double apply(double x, double y) {           
            return x - y;
        }
    };  
    private final String symbol;
    BasicOperation(String symbol) {
        this.symbol = symbol;
    }   
    @Override
    public String toString(){
        return symbol;
    }
}
public enum ExtendedOperation implements Operation{
    Exp("^"){
        public double apply(double x,double y){
            //次冪計算
            return Math.pow(x, y);
        }
    },
    REMAINDER("%"){
        public double apply(double x,double y){
            return x % y;
        }
    };

    private final String symbol;
    ExtendedOperation(String symbol) {
        this.symbol = symbol;
    }
    @Override
    public String toString(){
        return symbol;
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白银市| 北川| 临江市| 祁阳县| 香格里拉县| 西贡区| 西宁市| 犍为县| 海盐县| 左权县| 若尔盖县| 舞阳县| 霍林郭勒市| 尉犁县| 太和县| 襄垣县| 喀什市| 亳州市| 达州市| 邯郸市| 和林格尔县| 六枝特区| 游戏| 黔南| 恭城| 阜新| 吴忠市| 桑日县| 麦盖提县| 康定县| 若尔盖县| 铅山县| 平陆县| 邯郸市| 大方县| 濮阳县| 千阳县| 南安市| 米泉市| 温州市| 兴宁市|