2017-09-07 6 views
0

コンテキストをせずに2つの2の静的関数を崩壊しますリファクタリング、どの親関数が非静的

は、我々はマイクロサービスに移動するためにコードをrefectoringしています。 複数の製品(A、B、CおよびA、B、Cの共通コードはモノリシックで サービス)。現在、共通のコード用の新しいサンドボックスを作成しています。

問題:

User.java 
    Class User { 
    public **static** void init(){ 
     List<Items> users=Items.getItemsList(); 
    } 


     } 


Items.java   
     Class Items { 
      public **static** Items getItemsList(){ 
       //many static functions and dependancy 

       return items; 
      } 
      } 

だからここに、両方の機能は静的であり、私は新しいサンドボックスではないItems.javaにのみUser.java を移動したいです。どのように私はこの依存を分解することができます。 と私はそれ以外の場合はコンパイルされません、サンドボックスはItems`もサンドボックス内に存在する必要があります」は、jarファイルを生成し、独立したプロジェクトを意味と仮定

+0

"私は[User]は静的ではありません" これはまさにあなたがすべきことなので恥ずかしいです。 –

+0

「新しいサンドボックスを作成する」または「新しいサンドボックスにのみUser.javaを移動する」とは、この依存関係をどのように「分解する」ことを意味し、なぜメソッドの「静的」修飾子が変化する? – Holger

+0

@Holger User.javaを使用している製品が複数あるためです。 User.java、Order.javaなどの一般的なファイル用の新しいサンドボックスを作成しています。 このシナリオは です。製品Aのサンドボックス+共通ファイル 'サンドボックス 製品Bのサンドボックス+共通ファイル'サンドボックス....最終的にマイクロサービスにつながる。これについて他のアイデアはありますか? Plsは示唆している? –

答えて

0

User.init()は非静的にすることはできません。

しかし、ItemsからIItems(恐ろしい名前を許して)などのインターフェイスを抽出できます。

public interface IItems { 
    // methods... 
} 

サンドボックスに含まれています。

そのように、工場のためのインタフェースの作成:また、サンドボックスに含まれ

public interface IItemsFactory { 
    List<IItem> create(); 
} 

を。

醜い部分は、静的としてUser.init()を維持しています。ハッキーなIoCパターンを使用して、IItemsFactoryの実装をUserに設定します。工場も静的でなければならない。

public class User { 
    private static volatile IItemsFactory factory; 

    public static setFactory(IItemsFactory factory) { 
     User.factory = factory; 
    } 

    public static void init() { 
     List<IItems> users = factory.getItemsList(); 
    } 
} 

A、B、およびCプロジェクトがIItemFactoryの実装を提供し、User.init()を呼び出す前に、それを設定するための責任がある:だからUserは次のようになります。

これはハーフベークされており、これらの静的メソッドは、次のリファクタリングの反復処理中に離れる必要があります。引き続きIoCパターンを使用しますが、工場をUserコンストラクタの一部として注入します。

public class User { 
    private IItemsFactory factory; 

    public User(IItemsFactory factory) { 
     this.factory = factory; 
    } 

    public void init() { 
     List<IItems> users = factory.getItemsList(); 
    } 
} 
+0

良い点 - 回答が更新されました! –

+0

次のコードが呼び出されるときは? /設定ファクトリ/初期化 パブリックユーザ(IItemsFactoryファクトリ){ this.factory = factory; } –

+0

'init()'がproducts/projects A、B、Cのどこかで呼び出されていると仮定しています。 'init()'を呼び出す前に工場を設定する必要があります。 –

関連する問題