2017-07-19 12 views
5

最近、私はBukkit APIを使ってコーディングしていますが、私の質問は直接関連していません。コンストラクタを介してインスタンスを渡すか、静的にインスタンスにアクセスしますか?

Bukkit APIでは、メインクラス(new MainClass()が単一のインスタンス)を持つことができるので、コンストラクタを使用してメインクラスをすべてのクラスに渡す方が良いでしょうか、または、インスタンス(MainClass.getInstance())を返す静的メソッドを使用する必要があります。

パフォーマンスと実践のどちらが優れているのが好奇妙です。

はこれがdependency injectionと呼ばれ

コンストラクタを使用して私のクラスのすべてにメインクラスを渡して、次のとおりです。

+0

あなたは[pass it](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

より良いアプローチは、実際の面で、あなたの最初の提案になりますpreferred alternative over global access

これは過度の暴露を防ぎ(encapsulation、これは良いことです)、natural mocking(PowerMockのようなフレームワークを使用するのではなく)を許可することでテストを簡単にします。可能であれば、このアプローチを使用することをお勧めします。 2番目の提案については


私はちょうどMainが可変である場合は特に、インスタンス

このアプローチは眉をひそめする傾向を返す静的メソッドを使用する必要があります。

グローバル可変インスタンスを公開する場合は、グローバル状態を導入しています(tends to be a pain)。

それに依存しているモジュールは、それに依存する他のモジュールと結合することがあります。これはcommon couplingと呼ばれ、可能な限り避けるべきです。カップリングの最も厳しい形態の1つです。

グローバルアクセスはアクセスを簡単にしますが、潜在的にコードが絡んでいる可能性があります。実際には、必要なときにのみ使用してください。

関連する問題