2015-11-12 3 views
-2

Я хочу создать глобальный список объектов, доступных для всего класса моего пакета.Создать глобальный объект списка Java

Например, вот класс, который создает объект

public class Class2 { 

protected String one, two, three; 

public void newItem(String one, String two, String three) { 

    this.one = one; 
    this.two = two; 
    this.three = three; 
} 

public String getInfo() { 

    return one + "," + two + "," + three; 
} 

Я хочу, чтобы создать список объектов Class2 из другого класса (предположим Class1.java), и я хочу, чтобы список будет доступен из другого класса , скажем, Class3.java.

Поведение должно быть похоже на базу данных, где один класс создает список и другой класс, который читает этот список для выполнения локальных действий.

+0

Как насчет того, чтобы показать нам ваши лучшие усилия в первую очередь? Проверьте http://stackoverflow.com/help/how-to-ask – StarShine

+0

как насчет инъекции зависимостей? –

ответ

0

Простое решение без каких-либо дополнительных зависимостей и одиночек:

//Class which represents this "data storage" of yours. You can even have multiple instances of it simultaneously if you need 
class Database { 
    //Some data the DB contains 
    private List<MyEntity> entities = new ArrayList<>(); 

    //Way to read the stored data 
    public List<MyEntity> getEntities() { 
     return entities; 
    } 

    //Way to add new data 
    public void addEntity(MyEntity newEntity) { 
     entities.add(newEntity); 
    } 
} 

//Some working class, which fills the database with information 
class EntityCreator { 
    private final Database db; 

    //Each working class attaches itself to specific database instance. Therefore, you need to pass that instance through the constructor and save it for later job 
    public EntityCreator(Database operationalDb) { 
     this.db = operationalDb; 
    } 

    public void writeSomeData() { 
     for (.....) { 
      db.addEntity(new MyEntity(...)); 
     } 
    } 
} 

//Some working class, which depends on information saved in database 
class EntityReader { 
    private final Database db; 

    //Each working class attaches itself to specific database instance. Therefore, you need to pass that instance through the constructor and save it for later job 
    public EntityCreator(Database operationalDb) { 
     this.db = operationalDb; 
    } 

    public void doSomeWork() { 
     for (MyEntity e : db.getEntities()) { 
      doStuff(e); 
     } 
    } 
} 

//Example of the full workflow 
class MainClass { 
    public static void main(String[] args) { 
     Database db = new Database(); 
     EntityCreator creator = new EntityCreator(db); 
     EntityReader reader = new EntityReader(db); 

     creator.writeSomeData(); 
     reader.doSomeWork(); 
    } 
} 

Кроме того, стоит отметить, что не поточно, но это дает основную идею за проводкой зависимостей вместе без использования рамки DI.

+0

спасибо, он работает. –

+0

после того, как я реализую это в своей программе, произошло исключение. я думаю, вы правильно говорите, что это не потокобезопасно, я думаю, что мне нужно изучить другое решение для разработки данных db внутри Java Fx Application Thread. –

+0

Легкий способ (возможно, не очень оптимизированный для вашего конкретного сценария) заключается в том, чтобы обернуть ArrayList с помощью 'Collections.synchronizedList'. То есть в классе «База данных» измените объявление списка на «private List» entity = Collections.synchronizedList (новый ArrayList ()). Это должно сделать его несколько потокобезопасным. Кроме того, это быстрое и грязное решение, так как правильное решение для обеспечения безопасности потоков зависит от конкретных сценариев использования вашей «базы данных». – bezmax

Смежные вопросы