2016-09-23 6 views
4

すべてのインスタンスを起点に移動する静的メソッドを作成しようとしていますが、インスタンス変数(xPositionやyPositionなど)では静的メソッドを使用できません。Javaのすべてのインスタンスを何かにするには

すべてのインスタンスをループする必要がありますか、または静的メソッドでこれを行う方法はありますか?

ありがとうございます!

+0

インスタンスの「起源」とは何ですか?あなたは模範を持っていますか? – AxelH

+0

質問がある場合:特定のクラスのすべてのインスタンスを取得する方法はありますか?コレクションで使用されているすべてのインスタンスを手動で保存しない限り、答えはノーです。 –

+0

キャンバスにペイントし、(0,0)を起点として使用しています。 –

答えて

4

安全性をスレッドに関してより多くの注意が必要ですその後

public class MyClass { 
    /** 
    * Thread-safe collection used to store all existing instances 
    */ 
    private static final Collection<MyClass> INSTANCES = new ConcurrentLinkedQueue<>(); 

    private MyClass() {} 

    public static MyClass newInstance() { 
     // Create the instance 
     MyClass instance = new MyClass(); 
     // Publish the instance 
     INSTANCES.add(instance); 
     return instance; 
    } 

    public static void release(MyClass instance) { 
     //Un-publish my instance 
     INSTANCES.remove(instance); 
    } 

    public static void releaseAll(Predicate<MyClass> predicate) { 
     //Un-publish all instances that match with the predicate 
     INSTANCES.stream().filter(predicate).forEach(INSTANCES::remove); 
    } 

    public static void apply(Consumer<MyClass> consumer) { 
     // Execute some code for each instance 
     INSTANCES.stream().forEach(consumer); 
    } 
} 

あなたのコード:クラス、私は、インスタンスを作成し、公開コンストラクタprivateを作り、staticメソッドを呼び出して強制することにより、直接インスタンスを作成することを可能にするようなものを妨げます

// Create my instance 
MyClass myClass = MyClass.newInstance(); 
// Execute some code here 
... 
// Release the instance once the work is over to prevent a memory leak 
MyClass.release(myClass); 
... 
// Execute some code on all instances 
// Here it will print all instances 
MyClass.apply(System.out::println); 
... 
// Release all instances that match with a given test 
MyClass.releaseAll(myClass -> <Some Test Here>); 
+0

最も有用な洞察力!ありがとう!! –

3

すべてのインスタンスの静的レジストリがある場合は、静的メソッドで行うことができます。

class YourClass { 
    static List<YourClass> instances = new ArrayList<>(); 

    YourClass() { 
    instances.add(this); // Yuk! Unsafe publication. 
    } 

    static void moveAll() { 
    for (YourClass instance : instances) { 
     // Do something to instance. 
    } 
    } 
} 

しかし、私はあなたがいることをしないお勧めしますが、代わりに非静的レジストリクラスを持っていると思います:

class YourClassRegistry { 
    List<YourClass> instances = new ArrayList<>(); 

    void add(YourClass instance) { 
    instances.add(instance); 
    } 

    void moveAll() { 
    for (YourClass instance : instances) { 
     // Do something to instance. 
    } 
    } 
} 

使用例:

YourClassRegistry registry = new YourClassRegistry(); 
registry.add(new YourClass()); 
registry.add(new YourClass()); 
registry.add(new YourClass()); 

registry.moveAll(); 

をこれはあなたがすることができます別々に移動できる「インスタンス」の別々のグループがあります。

(レジストリの静的バージョンなど)グローバル可変状態は、首の痛みで、テスト容易性を減少させ、あなたのすべてのインスタンスを持っていることを確認するためになど

+0

ハムは本当にスレッドセーフではありません –

+1

スレッドセーフにすることができます。 TBH、それはここで第二の関心事です。 –

+0

はエラーが起こりにくく、私の場合はYourClassのインスタンスを作成できないようにしてください。そうしないと、addを呼び出すことができなくなる可能性があります。今のところ、YourClassRegistryは何とかYourClassのコレクションに過ぎません。さらに進んでください。同意し​​ないでください。 –

関連する問題