iT邦幫忙

0

{CMoney戰鬥營} 的第三週 #內部類別 及 Lambda

  • 分享至 

  • xImage
  •  

心得

  這星期過得有一點迷茫,又有新的工具加入,使用準則短短的就敘述完畢了,困難的是我不知道什麼時候要使用它!不意外的類別可以鑲嵌在類別之間而產生了內部類別,方便管理,過去也在一些coding練習的網站中不時有看到Lambda表示式,一直視之為譁眾取巧的旁門左道,沒想到其實是增加效能的實用方法。原本平舖直敘的程式碼經過一連串的物件導向被拆得零零碎碎,隨著加強對細節的要求,不斷的在一塊塊的拼圖中迷航,增加應付突如期來的變化的擴充性。看著碎裂的程式,我到底寫到哪裡了呢?要怎麼測試,還少哪一塊呢?還在練習適應加入了物件導向的世界...

學習筆記

內部類別

  • 包裝在外部類別中的類別
  • 通常只為了在外部類別中使用, 建議將存取等級設為private, 以免再不同類別中交互使用, 管理紊亂
  • 可直接調用外部類別的屬性及方法
  • 如果需要在外部類別創建前調用, 則可設定為static
    public class Gambling {
        Dice a;
        Dice b;
        public Gambling(int n){
            a = new Dice(n);
            b = new Dice(n)
        }
        private class Dice {          //內部類別
            int[] dices;           
            public Dice(int n){
                dices = new int[n];
            }
            public int sum(){...}
        }
    }

匿名內部類別

  • 使用介面時, 可能會為了要實作內部的方法而開新的類別, 但並未被重複利用
  • 可以使用匿名內部類別直接實作 (但是系統還是會自動命名產生一個類別)
  • 可以直接使用外部屬性或方法, 但是調用的外部屬性強迫變成final
  • 在Java 8 加入Lambda 後, 已不建議使用
    public class Gambling {
        ...
        private interface Compare{
            int diff(Dice a, Dice b);
        }
        Compare bigger = new Compare(){     // 匿名內部類別
            @Override
            public int diff(Dice a, Dice b{
                return a.sum() - b.sum();
        }
    }

Lambda

  • 當介面中只有一個抽象方法時, 可以用 lambda 來取代匿名內部類別
  • 因為只有一個抽象方法, 不需要再描述方法的參數/回傳資訊, 直接幫參數命名, 然後撰寫實作內容即可
        private interface Compare{             //只有一個抽象方法的介面
            int diff(Dice a, Dice b);
        }
        Compare bigger = new Compare(){        //匿名內部類別
            @Override
            public int diff(Dice a, Dice b {
                return a.sum() - b.sum();
            }
        };

        Compare bigger2 = (a,b) -> {a.sum()-b.sum()};  //lambda

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言