Расширение строки для безопасности типов - Java - PullRequest
3 голосов
/ 14 декабря 2011

Я рассматриваю проект на Java, где мне нужен строковый объект, но с большей «безопасностью типов», чем просто класс String. Это потому, что у меня есть несколько объектов 'POJO' для Hibernate, представляющих мои таблицы базы данных. Каждый из этих классов имеет большое количество открытых статических полей, представляющих свойства этого класса, т.е.

public class PersistantBean {
    public static String PROP_FIELD_COLUMN_ONE="columnOne";
    public static String PROP_FIELD_COLUMN_TWO="columnTwo";
    // [...]

Эти свойства используются, когда нам нужен общий доступ к свойству, например, для кода, который я сейчас пишу .parseAndSet(PROP_FIELD_PRICE,"£3.00").

Я хотел бы иметь возможность добавить более сильный тип в поля PROP_FIELD_..., чтобы я мог написать

public class PersistantBean {
    public static PropertyName PROP_FIELD_COLUMN_ONE="columnOne";
    public static PropertyName PROP_FIELD_COLUMN_TWO="columnTwo";
    // [...]

с минимальными изменениями в других частях проекта,

чтобы parseAndSet выглядел так:

public void parseAndSet(PropertyName prop, String priceToParse)

По сути, я бы хотел, чтобы PropertyName был типом, который во всех отношениях похож на String, кроме компилятора, произойдет ошибка, если я попытаюсь поместить String там, где ожидалось PropertyName, это любой шаблон проектирования, подобный этому возможный. (Я уклоняюсь от Enums, хотя сейчас я упоминаю об этом, Enums может быть подходящим вариантом).

Ответы [ 5 ]

3 голосов
/ 14 декабря 2011

Для Java 1.5 и выше просто используйте тип перечисления .

Для Java 1.4 и ниже используйте шаблон перечисления typesafe .Например,

public class Suit {
    private final String name;

    public static final Suit CLUBS =new Suit("clubs");
    public static final Suit DIAMONDS =new Suit("diamonds");
    public static final Suit HEARTS =new Suit("hearts");
    public static final Suit SPADES =new Suit("spades");    

    private Suit(String name){
        this.name =name;
    }
    public String toString(){
        return name;
    }

}
2 голосов
/ 14 декабря 2011

перечисление (перечисление) является лучшей идеей, которая вышеупомянутый сценарий.

например:

enum PROP_FIELD_COLUMN { columnOne, columnTwo и т. д. }

2 голосов
/ 14 декабря 2011

Я бы использовал Enum. Таким образом вы получаете проверку во время компиляции.

Если ваши строки действительно имеют довольно стандартное соглашение об именах, такое как "column" + "One", "Two" и т. Д., Как в вашем примере, вы можете сэкономить много работы, комбинируя перечисление для префикса с int для суффикса. Итак, создайте метод класса или утилиты, который принимает перечисление для префикса, например, COLUMN и объединяет его с int, скажем, 2, чтобы получить "columnTwo".

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

РЕДАКТИРОВАТЬ ДОБАВЛЕНО

У

@sethupathi.t была хорошая идея в его ответе - в некоторых случаях может быть предпочтительнее сделать 2-й аргумент (для которого я использовал int) также перечислением.

1 голос
/ 14 декабря 2011

Мне нужно ответить на вопросы Enum.

Однако, более буквальный ответ на ваш вопрос заключается в том, что Java предоставляет интерфейс для String-подобных объектов, java.lang.CharSequence , и многие части стандартных библиотек Java были обновлены для поддержки CharSequence. где уместно. Это, однако, не даст вам желаемого поведения, которое заставит ваш класс вести себя как подтип String.

1 голос
/ 14 декабря 2011

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

Первый способ (и, вероятно, лучший способ, если он работает для вас) - это использовать enum,как упомянуто в другом ответе.

Второй способ, который может потребоваться, если вы не знаете все свои PropertyName во время выполнения, - это использовать PropertyNameFactory в соответствии с:1007 * Это не идеальный вариант, поскольку он не обеспечивает истинную безопасность типов имен ваших свойств, но обеспечивает их действительность.

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