Как создавать объекты с атрибутами, сгенерированными по уникальному ключу - PullRequest
0 голосов
/ 08 апреля 2011

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

Спецификация свойства будет регулярной (т. Е. Если один ключ имеет свойство с именем description, то так же будет и с любым другим ключом).

Плохой пример

Этот пример - то, как я сначала попытался подойти к проблеме, и этого недостаточно. Я размещаю это здесь, чтобы проиллюстрировать проблемы с этим подходом

Я мог бы иметь класс Food, который имеет атрибуты name и description. В этом случае предполагается, что имя является уникальным ключом, в данном случае просто описанием.

public class Food {
  private String name;
  private String description;

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

Проблемы с этим подходом

Во-первых, всякий раз, когда я создаю особый вид пищи, скажем, пиццу, мне приходилось каждый раз вводить одно и то же описание, например «Популярное итальянское блюдо». Я бы предпочел, чтобы у меня была возможность создать объект, зная только название еды, а затем заполнить остальные атрибуты для меня. Другими словами, я должен быть в состоянии просто передать пиццу, и объект будет создан с соответствующим описанием.

Во-вторых, в этом примере нет гарантированной уникальности для атрибута name. Я мог бы создать пиццу с описанием «Популярного итальянского блюда», а другую - с описанием «Сырного добра»! Однако я хочу, чтобы имя однозначно выбрало набор атрибутов. Конечно, атрибут может принадлежать нескольким ключам (пицца и паста могут иметь описание «итальянского блюда»), но ключ может иметь только конкретное описание.

Потенциальные решения

Я предполагаю, что для этого потребуется как минимум 2 вещи:

  1. Какой-то способ связать имя с набором атрибутов. HashMap кажется идеальным для этого, но где было бы хорошее место для его хранения? Кажется очень странным помещать его в класс Food.

  2. Некоторый создающий класс, который обрабатывает создание объектов Food (возможно, это было бы хорошим местом для вышеупомянутого HashMap?) Я изучал шаблоны Factory и Builder, но Factory, кажется, для создания разные подклассы, и я хочу иметь возможность хранить тысячи разных имен элементов (а не создавать тысячи разных подклассов). Кажется, что Builder предназначен для определения всех атрибутов объекта более простым способом, чем запоминание порядка параметров в конструкторе, и в то же время гарантирует, что объект не может быть создан на полпути, но это, кажется, почти противоположно тому, что я ищу.

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

Карта - это хорошая структура данных для хранения предопределенных атрибутов. Но вам нужен код, который копирует атрибут в объект, то есть вызывает код, подобный следующему:

food.setDescription(attrs.get("description"))

Этот код может быть написан на заводе. Фабрика не обязательно создает экземпляры разных классов. Он может создавать экземпляры одного класса и инициировать их.

Другой подход - использование шаблона с именем шаблона объекта. Это означает, что вы создаете несколько объектов, таких как пицца, паста, кол, суп и т. Д. С уже заданными свойствами. Затем, когда вам нужно создать еще одну пиццу, вы сначала создаете копию уже существующей пиццы, а затем изменяете ее, чтобы сделать свою конкретную пиццу. В java существуют различные способы создания копии существующего объекта: конструктор копирования, клонирование, сериализация и т. Д.

0 голосов
/ 08 апреля 2011

Вы можете использовать инфраструктуру ORM (например, Hibernate) для сопоставления класса Java с таблицей базы данных, это позаботится об управлении и генерации первичного ключа для класса Java.

0 голосов
/ 08 апреля 2011

Вам нужна фабрика и несколько перегруженных конструкторов.

public class Food {

  private static final String DEFAULT_DESCRIPTION = "My favorite!";
  private String name;
  private String description;

  public Food(String name) { 
     this(name, DEFAULT_DESCRIPTION);
  }

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

class Pizza extends Food {

  private static final String DEFAULT_DESCRIPTION = "A popular Italian dish";

  public Pizza(String name)
  {
     super(name, Pizza.DEFAULT_DESCRIPTION);
  }

  public Pizza(String name, String description) {
     super(name, description);
  }

}

public class FoodFactory {

    private static final FoodFactory instance = new FoodFactory();

    private FoodFactory() {}

    public static FoodFactory getInstance() { retun this.instance; }

    public Food create(String name, String description) {
        // Here's where you can create different kinds of food based on your requirements
    }
}
0 голосов
/ 08 апреля 2011

Я согласен, что hashmap идеален, и я бы порекомендовал какой-то вспомогательный класс mapper, который бы брал ваши имена и описания из файла или базы данных xml, а затем вставлял их в карту хешей. Это будет место, где живет ваш hashmap. Затем вы можете использовать фабрику для создания объектов питания и вставлять зависимости имени и описания из хэш-карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...