2012-06-21 3 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; 
     } 
    }; 

Я не могу понять, что на самом деле сделано в этом коде !!! Что делает new перед CostFunction(). Вообще-то, я совершенно испорчен в понимании этого!Интерфейсы и их использование

ответ

1

Это просто анонимная реализация интерфейса CostFunction. Так же, как если бы вы создали класс, реализующий этот интерфейс, и создали экземпляр этого класса. EDIT: Я имею в виду, экземпляры два разных классов, потому что в вашем коде есть две реализации.

+0

«Это просто анонимная реализация интерфейса CostFunction». Что это значит iozee? означает то, что ОДИН и ДВА в этом коде - переменные, объекты что? И если это экземпляры двух разных классов, то что означает «public static final CostFunction ONE»? Это экземпляр функции CostFunction, потому что это невозможно, не так ли? – agarwav

+0

@ user1468694 Это похоже на объявление класса CostFunctionImpl, который реализует интерфейс CostFunction, а затем присваивает ** new 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 автономного класс MinimumEditDistance с использованием вышеуказанного

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

Хотя они могут быть уродливыми, иногда вы хотели иметь такую ​​быструю реализацию интерфейс, потому что вы можете получить доступ к переменным и методам от контейнерный класс. Вы увидите много их при использовании слушателей.

+0

Thanx много: D Теперь я понял это. – agarwav

+0

Рад, что я мог помочь. – Morfic

1

инстанциация ONE и TWO создает анонимные классы, которые реализуют интерфейс 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; 
    } 
}; 

Это создает класс CostFunction $ 1.class по JAVAC

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

Являются ли ОДИН и ДВА экземплярами одного и того же класса или разных классов, если ONE является экземпляром «AnonymousInnerClass1», а затем является экземпляром этого класса или «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()); 
    } 
} 
Смежные вопросы