2014-03-30 62 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的建議並避免它? –

相關問題