2014-01-11 62 views
1

我正在爲CraftBukkit編寫一個插件,並已將類和方法分解爲單獨的文件供組織使用。我有的問題是我需要傳遞插件到其他類爲了使用它的方法。例如:在需要構造函數的參數的類中使用方法(Bukkit插件)

SimpleBans.java

public class SimpleBans extends JavaPlugin { 
    private final DatabaseManager dm = new DatabaseManager(this); 
} 

DatabaseManager.java

public class DatabaseManager { 
    private Plugin plugin; 
    public DatabaseManager(SimpleBans pluginConstructor) { 
     plugin = pluginConstructor; 
    } 

public void writeData(String SQL) { 
    // Pseudo code: Write plugin.getName(); into the database. 
} 

現在工作正常。但是,如果我想從另一個類使用writeData方法,我沒有什麼作爲參數傳遞例如:

PlayerListener.java

public class PlayerListener { 
    private final DatabaseManager dm = new DatabaseManager(SOMETHINGGOESHERE); 
} 

我不能用這個空或者因爲它必須是一個插件來匹配DatabaseManager.java中的構造函數參數。

這一直困擾着我多年。任何幫助都會受到歡迎。

public class DatabaseManager { 

    public static DatabaseManager initManager() { 
     SimpleBans simpleBans = new SimpleBans(); //Or however you construct it 
     return new DatabaseManager(simpleBans); 
    } 

} 

然後在你的其他類,只需撥打:

回答

0

不要嘗試在PlayerListener內部創建新的DatabaseManager。相反,將DatabaseManager作爲偵聽器類的構造函數參數。這樣,您可以在創建偵聽器時使用已經構建的DatabaseManager

0

類似下面的內DatabaseManager創建方法

private final DatabaseManager dm = DatabaseManager.initManager(); 

我相信這是一種設計模式,但我忘記了它的名字。

1

爲什麼不使用帶有空參數的構造函數?有理由嗎?然後,您的類將是...

public class DatabaseManager { 
    private Plugin plugin; 

    public DatabaseManager() { 
     this.plugin = new SimpleBeans(); 
    } 

    public DatabaseManager(SimpleBans pluginConstructor) { 
     plugin = pluginConstructor; 
    } 

    public void writeData(String SQL) { 
     // Pseudo code: Write plugin.getName(); into the database. 
    } 

    ... 
} 

然後DatabaseManager可以用兩種方式來實例化。

希望我幫了忙!

相關問題