2016-05-09 7 views
1

4つの異なるエンドポイントを呼び出すことができるAPIクライアントがあります。私は問題に遭遇しています。私は、それぞれのAPI呼び出しメソッドが他のメソッドと独立しているため、可能な限り構成可能なものにしようとしています。だから、私は彼らが柔軟性と呼ぶことができる順序を残したいと思います。ここで私は何を意味するかである:メソッドの実行順序を設定する

public class APICaller() { 
    public void endpointA() {... 
    } 

    public void endpointB() {... 
    } 

    public void endpointC() {... 
    } 

    public void endpointD() {... 
    } 
} 

Iは(A、B、C、D)エンドポイント列挙の配列を渡し、その後、配列の内容を反復と関連を呼び出すことによってこれを行うことを試みました方法:switch文を使用して:

for (Endpoint end : passedInArrayOfOrdering) { 
    switch(end) { 
     case A: 
      endpointA(); 
     ... 
    } 
} 

私の上記の試みは少し汚いようです。これらのエンドポイント呼び出しを行う順序を設定できる既存のパターンはありますか?

+0

この2週間前に同様の質問がありました。それは[javafxのメソッド参照](http://stackoverflow.com/questions/36664453/java-8-method-references-with-javafx)ですが、基本的なアプローチは調査するのに役立つかもしれません。 – KevinO

答えて

1

具体的なパターンは実際にはありません。せいぜい、それをCommand Patternのインスタンスと見なすことができます。ここでは方法の種類という

import java.util.Arrays; 
import java.util.List; 

public class ApiCallerExample { 
    public static void main(String[] args) { 
     ApiCaller a = new ApiCaller(); 

     List<Runnable> commands = Arrays.asList(
      a::endpointB, 
      a::endpointA, 
      a::endpointD, 
      a::endpointC, 
      a::endpointA, 
      a::endpointB); 
     commands.forEach(Runnable::run); // Prints "BADCAB" 
    } 
} 

class ApiCaller { 
    public void endpointA() { System.out.print("A"); } 
    public void endpointB() { System.out.print("B"); } 
    public void endpointC() { System.out.print("C"); } 
    public void endpointD() { System.out.print("D"); } 
} 

注:あなただけMethod Referencesを使用して、呼び出されるメソッドを保存し、リストを反復処理することができます。幸いなことに、Javaの8は、すでにあなたが一般的にこれを処理するために必要なすべてが含まれていますRunnableです。何も返さない引数のないメソッドなのでです。あなたの方法は、必要な場合には、引数(または何かを返された)呼び出しサイトで特定のinvovationに、あなたは適切なfunctional interfaceを使用することができますいずれか、または「ピン」あなたのメソッドの引数:

Runnable runnable0 =() -> apiCaller.endpointA(argument0, argument1); 
commands.add(runnable0); 
1

あなたは通話

パブリックインターフェイスの発信者

{ 無効callSomething(APICaller AC)を製造するためのインタフェースを定義することができます。その後、 }

と実装

public class CallA implements Caller 
{ 
    public void callSomething(APICaller ac) 
    { 
    ac.endpointA() 
    } 
} 

を定義すると周りに渡すなどの代わりに、あなたのエンドポイント列挙のオランダカイウのインスタンスとしてオブジェクトので、あなたはスイッチ()ステートメントを使用する必要はありません。

+0

これは私のAPICallerクラスでendpointA()などを公開しなければならないことを意味します。私はむしろそれを避けるだろう! –

1

実行されているロジックを切り替えるには列挙型を使用しています。これはロジックが型に依存していることを意味します。 Endpointをインターフェイスにして、特定のエンドポイントを作成します。例えば。

public interface Endpoint { 
     public void call(); 
} 

public class EndpointA implements Endpoint { 

    public void call(){ 
     // endpoint a specific code 
    } 

} 

あなたは

for (Endpoint end : passedInArrayOfOrdering) { 
    end.call() 
} 

その後、スイッチを避けることができますPS:あなたは(列挙型を持つなど)型スイッチのいくつかの種類を使用毎回あなたはタイプに基づいて手動で実行するコードを解決。 JVMはこれをより良く行うことができます。ダイナミックディスパッチという名前です。オブジェクト指向の観点からは、それは単なる多型である。

私はブログを書いてabloutタイプスイッチを書いて、長所/短所について議論しました。 https://www.link-intersystems.com/blog/2015/12/03/enums-as-type-discriminator-anti-pattern/

0
public class EndPoint { 

    public void call() { 
     // process endpoint 
    } 
} 

今すぐコンテンツを聞かせて/各エンドポイントのデータは、一方のエンドポイントと他方のエンドポイントを区別します。例えば、それらが幾何学的な点であれば、それはそれらの座標である。 endpointA、endpointBなどのメソッドを作成する必要はありません。何百ものポイントがある場合は何百ものメソッドを作成しますか? No.

... 

for (Endpoint end : passedInArrayOfOrdering) { 
    end.call(); 
}