2012-02-29 4 views
0

Обычно я не задаю вопросы noob, но .... Я что-то пропустил с тех пор, как начал программировать.о «бинарных» типах данных

Давайте представим объект объекта pojo с несколькими именами свойств, описанием и т. Д. Одним из них является «направление», которое может быть только «IN» или OUT.

Каков наилучший тип данных для этого свойства? Я мог бы использовать логическое значение, считая, например, true, как и false, как out. Или, может быть, я могу использовать один символ «I» и «o» или «enum».

Рассмотрите, что я буду использовать этот объект со спящим режимом, свойство будет идти по столбцу таблицы. Итак ... Каков наилучший тип данных для столбца?

Спасибо

+0

См http://stackoverflow.com/questions/135845/are- booleans-as-method-arguments-неприемлемо – skaffman

ответ

2

Я предлагаю Enum.

Преимущества:

  • Вы можете расширить набор возможных значений переменной позже (если это станет необходимым).
  • Имена значений содержат ценное значение о семантике значений.
  • Ваш язык программирования поможет вам проверить тип.

Конечно, это означает, что вы должны использовать описательные имена для значений перечислений ...

2

Я думаю enum лучше всего подходит для этой цели.

public enum STATE {IN, OUT} 

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

1

Я хотел бы использовать enum и сохранить значение перечисления преобразуется в String в таблице базы данных. Подробнее об этом читайте в статье Java Enums.

1

Вы можете иметь перечисление представлять направление

public enum Direction { 
    IN('i'), OUT('o'); 

    final char dir; 
    Direction(char dir) { 
     this.dir = dir; 
    } 

    public static Direction find(char c) { 
     for (Direction d : Direction.values()) { 
      if (d.dir == c) 
       return d; 
     } 
     throw new IllegalArgumentException("Not found: " + c); 
    } 
} 

Вы можете привязать его к колонку полукокса в вашем дб и с Hibernate/JPA в вашей организации, просто установить столбец с типом CHAR, и разоблачать только ваше перечисление с геттером/сеттером.

@Entity 
public class MyEntity { 
    @Column 
    private char direction; 

    public Direction getDirection() { 
     return Direction.find(direction); 
    } 

    public void setDirection(Direction dir) { 
     this.direction = dir.dir; 
    } 
} 
+0

Меня интересует, что: в вашем коде есть неявное преобразование? Это просто работает? :) –

+0

База данных не знает о перечислении, она просто хранит символ (внутреннее представление перечисления). Но внутри вашего кода сущность раскрывает только перечисление, а не внутреннее представление. Так что да, это так – Alex

1

Использовать enum. Для Hibernate, вы можете использовать следующее отображение, и он будет автоматически использовать имя значения перечисления для хранения/извлечения из БД:

 <type name="org.hibernate.type.EnumType"> 
      <param name="enumClass">foo.MyEnum</param> 
      <!-- 12 == java.sql.Types.VARCHAR --> 
      <param name="type">12</param> 
     </type> 
Смежные вопросы