2014-03-30 3 views
0

Я использовал библиотеку под названием Mallet. Это, безусловно, самая сложная библиотека Java, которую я когда-либо использовал. Они предоставляют учебники и шаблон кода, и я пытался понять это. Однако я натолкнулся на эту строку кода:Java pass and construct class как аргумент функции

TransducerEvaluator evaluator = new MultiSegmentationEvaluator(
       new InstanceList[]{trainingData, testingData}, 
       new String[]{"train", "test"}, labels, labels) { 
       @Override 
       public boolean precondition(TransducerTrainer tt) { 
       // evaluate model every 5 training iterations 
       return tt.getIteration() % 5 == 0; 
       } 
     }; 

Пожалуйста, не обращайте слишком много внимания на термин «преобразователь». Что передается в эту функцию? Два класса? Что это такое new String[]{}? Я просто очень смущен этим синтаксисом, которого я никогда раньше не видел.

Это код для этого метода:

public MultiSegmentationEvaluator (InstanceList[] instanceLists, String[] instanceListDescriptions, 
      Object[] segmentStartTags, Object[] segmentContinueTags) 

Может кто-нибудь сказать мне, что это странно конструкт?

+0

Что такое «новый»? Что такое 'String'? С чем связано '[]'? –

+0

Сладкие, анонимные классы. ИМО их следует избегать, как чуму, хотя это достаточно просто, чтобы я мог видеть оправдание этого. – Jared

ответ

0

Рассмотрим этот код:

String[] stringArr = new String[]{"train", "test"}; 

Имеет ли смысл сейчас? Это массив строк! =) Вот еще глупее код, чтобы доказать мою точку:

new String[]{"train", "test"}.getClass() == String[].class 
-1
InstanceList[] 

означает, что вы должны иметь список объектов, которые находятся в их типа InstanceList, то же самое для струнного [] для них:

Object[] 

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

В верхнем коде это именно то, что они делают, но они создают новые объекты для экземпляров InstanceList и String, а затем метки - это 2 объекта, которые они передают.

1

Эта конструкция делает несколько вещей:

  • создает подкласс MultiSegmentationEvaluator, не дав ему имя
  • Обеспечивает переопределение метода precondition(TransducerTrainer tt)
  • конкретизирует заново определенный анонимный класс, передавая два строковых массивов а затем labels конструктору, который принимает четыре параметра.
  • Назначает вновь созданный экземпляр переменной evaluator.

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

+0

Я вижу это сейчас ... Джи, это сумасшествие. Есть ли у вас учебник или соответствующая документация? Это определенно не под «подклассом». –

+1

@WindDweller [Вот ссылка на учебник по анонимным классам в Java] (http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html). – dasblinkenlight

+0

Спасибо :) Это похоже на ужасное и ужасное создание. Должен ли я использовать его или следовать советам @ Jared и избегать этого? –

Смежные вопросы