最近,我一直在使用Bukkit API進行編碼,但是我的問題與它沒有直接關係。通過構造函數傳遞實例或使用靜態方法訪問實例?
在Bukkit API中,可以有一個主類的單個實例(new MainClass()
會引發錯誤),所以我想知道,使用構造函數將主類傳遞給所有類是否更好,或者我應該只使用返回實例的靜態方法(MainClass.getInstance()
)
我很好奇哪一個更好(就性能和實踐而言)。
最近,我一直在使用Bukkit API進行編碼,但是我的問題與它沒有直接關係。通過構造函數傳遞實例或使用靜態方法訪問實例?
在Bukkit API中,可以有一個主類的單個實例(new MainClass()
會引發錯誤),所以我想知道,使用構造函數將主類傳遞給所有類是否更好,或者我應該只使用返回實例的靜態方法(MainClass.getInstance()
)
我很好奇哪一個更好(就性能和實踐而言)。
更好的方法,在實踐方面,將是你的第一個建議:
使用構造
這就是所謂dependency injection傳遞的主類,以我所有的類,並且是preferred alternative over global access。
它不鼓勵過度曝光(鼓勵encapsulation,這很好),並允許natural mocking(反對使用像PowerMock這樣的框架)使測試更容易。建議您儘可能使用這種方法。
至於你的第二個建議:
我應該使用返回實例
這種方法往往在被皺起了眉頭,特別是如果Main
是可變的靜態方法。
如果你公開一個全局可變實例,你正在引入全局狀態,其中tends to be a pain。
任何依賴它的模塊都可能會被耦合到依賴它的其他模塊。這被稱爲common coupling,如果可能的話應該避免,因爲它是最緊密的耦合形式之一。
全局訪問使訪問更容易,但代價是可能導致代碼糾結。它應該只在需要時才使用。
你應該[通過它](https://en.m.wikipedia.org/wiki/Dependency_injection),但你應該[只傳遞需要的東西](https://en.m.wikipedia.org/wiki/Law_of_Demeter),而不是將您的「主」對象傳遞給所有其他實例,然後讓這些實例挖掘主對象的內層。 –
@VinceEmigh更好地實現單身? –
@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),更具體地說,只傳遞需要的東西(而不是主要本身)以降低曝光度 –