2017-07-19 17 views
5

最近,我一直在使用Bukkit API進行編碼,但是我的問題與它沒有直接關係。通過構造函數傳遞實例或使用靜態方法訪問實例?

在Bukkit API中,可以有一個主類的單個實例(new MainClass()會引發錯誤),所以我想知道,使用構造函數將主類傳遞給所有類是否更好,或者我應該只使用返回實例的靜態方法(MainClass.getInstance()

我很好奇哪一個更好(就性能和實踐而言)。

+0

你應該[通過它](https://en.m.wikipedia.org/wiki/Dependency_injection),但你應該[只傳遞需要的東西](https://en.m.wikipedia.org/wiki/Law_of_Demeter),而不是將您的「主」對象傳遞給所有其他實例,然後讓這些實例挖掘主對象的內層。 –

+0

@VinceEmigh更好地實現單身? –

+0

@SureshAtta這將引入全局狀態,這使得代碼[難以推理](https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil),而且更難以測試。這將是濫用模式(這就是爲什麼它現在[被認爲是反模式](https://stackoverflow.com/questions/12755539/why-is-singleton-considered-an-anti-pattern))。 [推薦的選擇是DI](https://stackoverflow.com/questions/1300655/whats-alternative-to-singleton),更具體地說,只傳遞需要的東西(而不是主要本身)以降低曝光度 –

回答

3

更好的方法,在實踐方面,將是你的第一個建議:

使用構造

這就是所謂dependency injection傳遞的主類,以我所有的類,並且是preferred alternative over global access

它不鼓勵過度曝光(鼓勵encapsulation,這很好),並允許natural mocking(反對使用像PowerMock這樣的框架)使測試更容易。建議您儘可能使用這種方法。


至於你的第二個建議:

我應該使用返回實例

這種方法往往在被皺起了眉頭,特別是如果Main是可變的靜態方法。

如果你公開一個全局可變實例,你正在引入全局狀態,其中tends to be a pain

任何依賴它的模塊都可能會被耦合到依賴它的其他模塊。這被稱爲common coupling,如果可能的話應該避免,因爲它是最緊密的耦合形式之一。

全局訪問使訪問更容易,但代價是可能導致代碼糾結。它應該只在需要時才使用。

相關問題