2014-11-23 26 views
0

我剛剛試圖簡化我的類的構造函數,其中大約有50%的代碼相同,我最近偶然發現了這個問題。看起來我不能重複使用我的以前的構造函數定義(它處理初始化)從另一個重載它的構造函數。我如何在Java中使用沒有'new'的構造函數?

爲了清楚起見,這是我一直想說:

public MusicOrganizationHelper(Context context) 
{ 
    mContext = context; 
    // More object initializations using 'context'.. 
} 

public MusicOrganizationHelper(Context context, ArrayList<String> fileUris) 
{ 
    MusicOrganizationHelper(context); // Why can't I do this? 

    for (String uri : fileUris) { 
     if (uri != null && !uri.equalsIgnoreCase("")) { 
      try { 
       AudioFile audioFile = read(uri); 
       mAudioFileMap.put(audioFile, audioFile.getTagOrCreateAndSetDefault()); 
      } catch (CannotReadException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

我知道這可能通過使某種private void init(context)方法很容易產生,但我只是好奇:爲什麼我不能像其他任何方法一樣調用構造函數,即使是在其類定義中也是如此?他們看起來和我很相似(他們是建設者和'農民'方法)。

對不起,如果這原來是一個明顯的事情。一般來說,我對Java和OOP相對較新。

在此先感謝!

+4

'這個(上下文)'....? – MadProgrammer 2014-11-23 11:00:45

+0

查看任何java源(例如HashMap,ArrayList)。你會看到他們如何處理它。 – Maksym 2014-11-23 11:01:46

回答

2

替換此

MusicOrganizationHelper(context); // Why can't I do this? 

this(context); 

這是從同一個類的另一個構造函數調用一個構造方式。 請注意,這必須是構造函數的第一行。

構造函數體的第一條語句可能是顯式調用同一個類或直接超類(§8.8.7.1)的另一個構造函數。

JLS

+0

* Sla面*。對不起,我不知道這會很簡單。在10分鐘內接受..(必須遵守規則)。 – ridsatrio 2014-11-23 11:03:35

+0

..你能提供一個詳細說明爲什麼它必須在第一行嗎?對不起,如果這是有點太多問。 :) – ridsatrio 2014-11-23 11:05:00

+0

@ridsatrio這是語言規範。看我的編輯。 – Eran 2014-11-23 11:10:05

相關問題