Лучший способ получить доступ к списку в одном классе из другого класса - PullRequest
3 голосов
/ 18 января 2012

У меня есть класс, давайте назовем его «Слова», который читает файл и создает список строк.

Затем у меня есть класс 'Items', который создает список объектов 'description', каждому объекту описания требуется доступ к списку из 'Words'.

Поскольку список «Word» читает файл, я, очевидно, не хочу создавать этот список для каждого объекта «описание». Итак, как лучше всего получить доступ к этому списку?

Должен ли я просто создать функцию getList () из «Words» и передать ее конструктору «Items», а затем снова передать ее каждому «описанию»? или есть лучший способ? Если я сделаю это, то я также хотел бы убедиться, что это только ссылка на список, а не копия, поскольку список «Слова» может стать огромным.

Я относительно новичок в Java, и любая помощь будет оценена.

Ответы [ 4 ]

4 голосов
/ 18 января 2012

Я бы попытался сопротивляться искушению передать этот Список слов. Я не вижу там никакой инкапсуляции.

Я мог бы дать классу, который инициализирует и управляет списком слов, метод, который будет принимать Item, и интерфейс, который показал бы, как заполнять или фильтровать этот список слов для данного Item.

Я предполагаю, что количество слов, связанных с элементом, является небольшим подмножеством большего целого, и количество элементов является управляемым.

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

ОБНОВЛЕНИЕ: Исходя из вашего комментария ниже, я хотел бы знать, действительно ли вам нужна реляционная база данных. Предмету необходим список описаний; это простое СОЕДИНЕНИЕ в реляционной базе данных и сопоставление с объектами.

Разбор и заполнение таблиц - разовая вещь. Ваше Java-приложение может просто запросить экземпляры Item, которые дали описания. Вы можете попросить его рассказать вам все элементы, которые имеют описание "foo", например. Это может быть трудоемким и неэффективным, если использовать Java-объект в памяти. Позвольте реляционному оптимизатору ускорить его за вас. Вам также не нужно одновременно хранить все объекты в памяти. Просто запросите то, что вам нужно.

2 голосов
/ 18 января 2012

Вам нужно создать класс, который будет оцифровывать объект List объекта String (singleton), вызвать этот метод singleTon в конструкторе класса описания для присвоения ссылки списка объекту description.

public class Words
{
   private static ArrayList<String> words;
   public static ArrayList<String> getWords() 
   {
      if(words==null) 
        {
          words=new ArrayList<String>();
          //read strings from the file and add them into list
        }
      return words;
    }
}

В классе описания,

public class Description
{
   private String desc;
   private ArrayList<String> words;

   public Description(String desc) 
    {
        this.desc=desc; 
        this.words=Words.getList();
     }
}
0 голосов
/ 18 января 2012

Я хотел бы сделать, как показано ниже:

public class Words{
    private static List words;
    private Words();
    public static List getInstance(){
         if(words == null){
              words = getFile();
         }
         return words;
    }
    private List getFile(){
        //get file
    }
}

public class Items{
    public List items = Words.getInstance();
}

Извините, я не тестировал этот код, надеюсь, что он поможет вам придумать лучший способ, если он неправильный.

0 голосов
/ 18 января 2012

У вас есть два варианта:

  • Вы можете получить список из слов, используя getList (), как вы сказали. Затем вы передаете список в новый объект описания через его конструктор.
  • Вы можете объявить Список в словах как public static. Это позволит вам ссылаться на список по ссылке на класс; Words.list;

Первое решение, вероятно, является вашим лучшим вариантом, поскольку объявление статических переменных обычно нежелательно.

...