2014-03-30 23 views
0

我正在使用名为Mallet的库。这是迄今为止我使用过的最复杂的Java库。他们提供教程和代码模板,我试图理解它。但是,我碰到这行代码:Java pass和构造类作为函数参数

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

什么是“新”?什么是“字符串”?什么是与[]相关的? –

+0

甜美的匿名课堂。海事组织这些应该像瘟疫一样避免 - 虽然这很简单,我可以在那里看到它的理由。 – Jared

回答

0

考虑以下代码:

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

这有什么意义呢?它是一个字符串数组! =)这里有更傻的代码来证明我的观点:

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

意味着你需要有一个是他们输入InstanceList对象的列表,同样适用的String [] 这些:

Object[] 

意味着任何属于Object(任何对象)的子类的东西都可以作为最后两个参数的参数传递。

在上面的代码中,这正是他们正在做的事情,但他们为InstanceList和String创建了新的对象,然后标签是它们传递的2个对象。

1

此构造做几件事情:

  • 创建的MultiSegmentationEvaluator一个子类,而通过传递两个字符串数组给它起名字
  • 提供precondition(TransducerTrainer tt)方法的重写
  • 实例化的新定义匿名类然后labels给带有四个参数的构造函数。
  • 将新创建的实例分配给evaluator变量。

该代码使用Java的匿名类功能 - 一种非常方便的工具,用于必须子类化或实现接口的情况,但是您定义的类仅用于程序中的一个位置。

+0

我现在可以看到它... gee这是疯了。有没有关于此的任何教程或适当的文档?它绝对不在“子类”之下。 –

+1

@WindDweller [这是一个指向Java匿名类教程的链接](http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)。 – dasblinkenlight

+0

谢谢:)这看起来像一个可怕的和可怕的创作。我应该使用它还是遵循@ Jared的建议并避免它? –

相关问题