Странный вызов функции в java addData (a, b {немного дерьма}) - PullRequest
0 голосов
/ 25 июня 2010

Я столкнулся со странным вызовом функции, который показан ниже:

addData("abc", "abc" {
        public boolean isDataCorrect() {
          return true;
        }
      });

подпись addData

public void addData(String a, String b);

Может кто-нибудь объяснить, что делает код в фигурных скобках? Более того, как это вообще работает?

Ответы [ 2 ]

4 голосов
/ 25 июня 2010

Это не компилируется.

Возможно, вы видите то, чего больше не существует.

Например, предположим, что метод addData используется для получения String a , OtherClass b Позже, OtherClass был заменен на String, и в результате произошел автоматический ре-факторинг, что-то вроде:

// BEFORE
addData( "abc", new AbcValidator("abc"){  
       public boolan isDataCorrect(){
          return true;
       }
});  
addData( String a, AbcValidator b ) {
}

После рефакторинга кто-то (возможно, плохой инструмент рефакторинга) подумал, что можно использовать необработанную строку.

// AFTER:
addData( "abc", "abc"{  
       public boolan isDataCorrect(){
          return true;
       }
});  
addData( String a, AbcValidator b ) {
}

Когда вы его компилируете и запускаете, он даже не компилируется, но поскольку он был запущен раньше, скрипт запуска берет предыдущую версию (ту, которая использует AbcValidator) и выглядит так, как будто она работает, но это не так.

Почти невозможно угадать, что происходит на вашем столе, но не делайте ошибок, это не работает.

Чтобы проверить это, сделайте следующее:

A) создайте новый каталог и java "Hey.java" со следующим содержимым:

class Hey{
    public static void main( String [] args ) {
        addData("abc",   "abc" {
            public boolean isDataCorrect() {
                return true;
            }
        });
    }
    public void addData( String a, String b ){}
}

B) Скомпилируйте этот файл, желательно из командной строки: javac Hey.java

Вы увидите, что это не работает.

1 голос
/ 25 июня 2010

Ваш пример не компилируется.Самое близкое, что я знаю о том, что вы можете сделать подобным образом, это блок инициализации, например

public void addData(Map ... )
addData(new HashMap(){ { put("A", "B");}}

или анонимный класс, объявленный при вызове функции:

public interface Adder { public boolean isDataCorrect(); }
public void addData(Adder ...)
addData(new Adder(){ public boolean isDataCorrect();}...

Вы можете 'Не делайте ничего подобного со строками, например, реализуйте интерфейс или добавляйте метод в подкласс, потому что класс String является окончательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...