0

オートマトンでいくつかの操作を実行するプログラムを開発しています。オートマトンは状態 (別名ノード) と遷移 (別名エッジ) で構成されており、特定のプロパティを持つセットを取得するには、それらをフィルター処理する必要があります。この操作は簡単に実装できますが、数回実行されるため、小さなキャッシュを書き込みます。

以下のコードの断片には私の実装があり、監視可能な遷移をフィルタリングしてメモ化する正しい方法であるかどうかを知りたいです

public class Automata {
    private State initial;
    private Set <State> states; 
    private Set <Transition> transitions;
    private Supplier <Set <Transition>> observables;

    // ...

    public Automata() {
        this.initial = new State();
        this.states = new HashSet <> ();
        this.transitions = new HashSet <> ();

        this.observables = Suppliers.memoize(() ->
           transitions.stream().filter((t) -> 
              (t.isObservable() == true)).collect(Collectors.toSet()));
    }

    public getObservables() {
         return observables.get();
    }
}

質問:

  1. それが正しいか?
  2. 遷移が可観測性を変更した場合、この情報はサプライヤーにも伝播しますか?

英語が下手で申し訳ありませんが、十分に明確であることを願っています。

4

1 に答える 1

2
  1. はい、正しいです。
  2. いいえ、トランジションで行う変更は自動的に反映されません。そして、この場合、サプライヤーAFAIKは適切ではありません。次のように手動で上書きする必要があります。

    public void invalidate(){
        memorized = Suppliers.memoize(supplier);
    }
    

    またmemoizeWithExpiration、更新がそれほど頻繁ではなく、信頼できる読み取りが必要ないことがわかっている場合にも機能します。

    または、次のように使用する必要がありますCache

    CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() {
      public Graph load(Key key) throws AnyException {
        return createExpensiveGraph(key);
      }
    };
    LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader);
    
于 2016-03-17T12:26:45.470 に答える