Javaコールバック(callback)内部クラス(innerclass)


/**
 *   
 */
public class Animal {
    private String name;
    private int leg;//   
    private int weight;//  

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLeg() {
        return leg;
    }

    public void setLeg(int leg) {
        this.leg = leg;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}

 
import java.util.List;

/**
 *    
 */
public class Zoo {
    private String name;
    private List<Animal> animalList;

    /**
     *         
     * @return
     */
    public int calculateWeight(){
        return calculateTotal(new CallBack(){
            public int getAmount(Animal animal) {
                return animal.getWeight();
            }
        });
    }

    /**
     *       
     * @return
     */
    public int calculateLegs(){
        return calculateTotal(new CallBack(){
            public int getAmount(Animal animal) {
                return animal.getLeg();
            }
        });
    }

    /**
     *   calculateTotal  ,        ,
     * javascrip        ,         
     */
    interface CallBack {
        int getAmount(Animal animal);
    }

    /**
     *           
     * @param callBack
     * @return
     */
    private int calculateTotal(CallBack callBack){
        int total = 0;
        for (Animal animal : animalList) {
            total = total + callBack.getAmount(animal);
        }
        return total;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Animal> getAnimalList() {
        return animalList;
    }

    public void setAnimalList(List<Animal> animalList) {
        this.animalList = animalList;
    }
}
 
 
動物園の中に動物の群れがあると仮定して、私たちは動物の重量を統計する機能をしなければなりません.例えばcalculateWeight、動物の足の数を統計する方法をしなければなりません.その統計計算法は同じです.この場合、callbackを書いて、完成することができます.便利のために、直接内部クラスインタフェースを書いて、javaが閉パッケージ機能があれば、このインタフェースを定義する必要はありません:)