不変オブジェクトとしてアプリケーションの残りの部分に渡したいオブジェクトを構築したいと思います。しかし、ここでの問題は、オブジェクトの構築時にはいくつかのフィールドを直接利用できますが、RPCコールからの応答が必要なものもあります。 RPC呼び出しには時間がかかりますが、呼び出し元がオブジェクトの作成時に渡されるフィールドを使用したいので、この時間に呼び出し元をブロックしたくありません。私は念頭に置いてデザインをしていますが、標準パターンがあるかどうかを知りたがっています。最終的な不変性を持つ不変オブジェクトのデザインパターン
次の例は、私が探しているものを示しています。
public class Player {
private int name; // Available at construction time
private int age; // Available at construction time
private String profileUrl; // Need to get this from an RPC call
// useful for checking whether we have profileUrl
private boolean profileUrlAvailable = false;
Player(int name, int age) {
this.name = name;
this.age = age;
}
// usual getter methods
// Package protected for immutability
void setProfileUrl(String profileUrl) {
this.profileUrl = profileUrl;
this.profileUrlAvailable = true;
}
public boolean hasProfileUrl() {
return profileUrlAvailable;
}
// throws if profile url is not yet available.
public String getProfileUrl() {
if (!profileUrlAvailable) {
throw new IllegalStateException("Profile url not available");
}
return profileUrl;
}
}
この例はスレッドセーフではありません。この例は注意が必要です。興味のある発信者にプロファイルURLがいつ利用可能かを知らせるために、profileUrlが利用可能になったときに通知されるコール可能なものを登録するメソッドを公開します。
最終的に利用できるprofileUrlに似たいくつかのフィールドを追加すると、このアプローチはうまくいきません。私はこれを解決する方法を提案したかった。
profileUrlに似たフィールドがすべて同時に使用できるようにする(つまり、1つのメソッドを使用して設定する)ことは簡単ですか?
インターフェイスを使用して、外部コードで使用するメソッドを公開し、単に変更するメソッドを公開しないのはなぜですか? – AgilePro
確かに、それは外界には変更できないことを確認するでしょう。最終的に使用可能なフィールドを扱う際の問題の他の部分について考えてみましょう:hasField()、getField()&フィールドがいつ利用可能かを通知します。私は、内部クラスのすべてのフィールドを組み合わせて、単一呼び出しで設定し、これが設定されたときに世界に通知することができます。しかし、それを行うより良い方法はありますか? – Bajji
Builder Patternのようなものはあなたのために働くでしょうか? –