2012-06-21 58 views
1
public class MinimumEditDistance { 
    public interface CostFunction{ 
     public int cost(int[][] distanceMatrix,CharSequence x, CharSequence y,int i,int j); 
    } 
    public static final CostFunction ONE = new CostFunction() { 
     public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
      return 1; 
     } 
    }; 

    public static final CostFunction TWO = new CostFunction() { 
     public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
      return 2; 
     } 
    }; 

我無法理解此代碼中實際做了什麼! newCostFunction()之前表示什麼。其實,我對這個很瞭解!接口及其用法

回答

1

這只是CostFunction接口的匿名實現。就像如果你已經創建了一個實現這個接口的類並創建了這個類的一個實例。 編輯:我的意思是,兩個實例不同的類,因爲你的代碼中有兩個實現。

+0

「這只是CostFunction接口的匿名實現。」 這是什麼意思iozee?意味着在這段代碼中,ONE和TWO是什麼 - 變量,對象是什麼? 如果它們是兩個不同類的實例,那麼「public static final CostFunction ONE」是什麼意思?它是CostFunction的實例,因爲這是不可能的,對吧? – agarwav

+0

@ user1468694這就像聲明實現CostFunction接口的CostFunctionImpl類,然後將**新的CostFunctionImpl()**分配給ONE,與TWO相同,但例如將會有一個CostFunctionImpl2實例。 – iozee

+0

@ user1468694 public static final CostFunction ONE表示ONE是* CostFunction類型*。當你實現一個類的接口時,除了類的類型之外,它的實例也是CostFunction類型的。我的意思是,在這種情況下,我們對連接到ONE的對象的類不感興趣,但它是什麼類型。 – iozee

2

看看inner classes。你有什麼是內部接口的匿名內部實現,並且是一個非常髒的例子,這就是爲什麼你無法理解它。

如果你來拆分它,你必須:

-a獨立ConstFunction接口

public interface CostFunction{ 
    public int cost(int[][] distanceMatrix,CharSequence x, CharSequence y,int i,int j); 
} 

-a獨立ConstFunction實施名爲CostFunctionOne

public class CostFunctionOne{ 
    public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
    return 1; 
    } 
}; 

- 一個獨立的ConstFunction實現名爲CostFunctionTwo

public class CostFunctiontTwo{ 
    public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
    return 2; 
    } 
}; 

-a使用上述

public class MinimumEditDistance{ 
    public static final CostFunction ONE = new CostFunctionOne(); 
    public static final CostFunction TWO = new CostFunctionTwo(); 
} 

雖然他們可能非常醜陋獨立MinimumEditDistance類,有時你會選擇有這樣一個快速實現一個接口,因爲你可以訪問來自變量和方法容器類。使用偵聽器時你會看到很多。

+0

非常感謝:D現在我明白了。 – agarwav

+0

很高興我能幫到你。 – Morfic

1

ONETWO的實例化正在創建實現CostFunction接口的匿名類,因此您會看到cost方法在同一代碼塊中實現。

看看這個講述匿名類的page

0

這就是匿名內部類的用法。

public static final CostFunction ONE = new CostFunction() { 
    public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
     return 1; 
    } 
}; 

這將創建由javac的一類CostFunction $ 1.class

class 'Anonymous inner class' implements CostFunction { 
    public int cost(int[][] distanceMatrix, CharSequence x, CharSequence y, int i, int j) { 
     return 1; 
    } 
}; 
+0

ONE和TWO是同一類還是不同類的實例意味着假設ONE是「AnonymousInnerClass1」的實例,那麼TWO也是該類的實例或「AnonymousInnerClass2」?這是我的主要疑問。 – agarwav

+0

是的,它們是不同的類 –

0

基本上要實現的接口,並創建一個匿名類。要看到這個工作只需要運行下面的代碼:

public class Main{ 
    public interface CostFunction{ 
     public int cost(); 
    } 
    public static final CostFunction ONE = new CostFunction() { 
     public int cost() { 
      return 1; 
     } 
    }; 

    public static final CostFunction TWO = new CostFunction() { 
     public int cost() { 
      return 2; 
     } 
    }; 
    public static void main (String[] args) 
    { 
     System.out.println(ONE.cost()); 
    } 
}