2012-03-20 4 views
1

У меня есть вопрос о стиле коды:эффективные и красивые струнные условий в Java

Давайте предположим, что у меня есть строка, содержащая некоторую информацию (например, «информация1» или «информации2»). Основываясь на этом, я хочу создавать объекты с фабрикой. Очевидно, я мог бы написать что-то вроде этого:

if(string.equals("Information1")){ 
    Factory.createInformation1Object(); 
} 
if(string.equals("Information2")){ 
    Factory.createInformation2Object(); 
} 
if(string.equals("Information3")){ 
    Factory.createInformation3Object(); 
} 

Теперь мне было интересно, если есть лучше (и хорошеет) способ сделать это. Мне очень нравится идея множественного рассылки шаблона посетителя, но я не вижу способа легко применить эту проблему к этой конкретной проблеме.

+0

Вы могли бы использовать регулярное выражение как «информация [0-9]» с совпадением? Но я не лучший способ. – Kiwy

ответ

7

Вы можете использовать abstract factory pattern.

Создать абстрактный класс Factory [или интерфейс], и классы, расширяющий его: MyObject1Factory, MyObject2Factory, ...

На предварительной обработки, заселить Map<String,Factory> от String к coresponding Factory например, это делается только один раз в вашем приложении.

Когда вам нужно создать новый экземпляр - вызовите map.get(string).create(), чтобы создать соответствующий объект соответствующего типа.

Edit: Небольшой пример с кодом:
Ваши классы:

public static class MyBase { 
    @Override 
    public String toString() { 
     return "Base"; 
    } 
} 
public static class Class1 extends MyBase { 
    @Override 
    public String toString() { 
     return "Class1"; 
    } 
} 
public static class Class2 extends MyBase { 
    @Override 
    public String toString() { 
     return "Class2"; 
    } 
} 

И ваши заводы будут:

public static abstract class MyFactory { 
    public abstract MyBase build(); 
} 
public static class MyFactory1 extends MyFactory { 
    @Override 
    public Class1 build() { 
     return new Class1(); 
    } 
} 
public static class MyFactory2 extends MyFactory { 
    @Override 
    public Class2 build() { 
     return new Class2(); 
    } 
} 

заполнить карту только один раз в жизни программы :

Map<String,MyFactory> map = new HashMap<String, Test.MyFactory>(); 
    map.put("class1", new MyFactory1()); 
    map.put("class2", new MyFactory2()); 

и когда вам нужен новый объект, вызовите с:

MyBase obj = map.get(s).build(); 
    System.out.println(obj); 

(*) Примечание: Статический ключевое слово для классов здесь, потому что я создал их как внутренние классы - вы, конечно, нужно ommit его, если он это не ваш случай.

3

В Java 7 теперь вы можете использовать строки в операторах switch.

Обратите внимание, что ваш код не является прямым аналогом оператора switch, потому что теоретически возможно, чтобы все три фабричных метода вызывались только путем просмотра структуры кода (например, нет операторов else). Но на практике это невозможно, потому что string не может одновременно иметь все три значения.

+0

будет использовать оператор switch действительно лучше с точки зрения удобочитаемости и удобства использования? У меня все равно было бы огромное количество кода в одном месте, за исключением того, что у меня есть 'case' вместо' if's – Simiil

+0

Зависит именно от того, что вы просили! Я интерпретировал этот вопрос как вопрос о обработке строк (поскольку это подразумевает предмет), тогда как другие интерпретировали его как общий дизайн, шаблоны и т. Д. – dty

+0

Другими словами, с точки зрения дизайна нет, материально улучшить ситуацию. – dty

0

Я предпочитаю функциональный и читаемый. :-) Если строка является пустой и вызова метода, безусловно, бросить NPE, рассмотрим следующее вместо

"Information1".equals(strings) 

Возможно информация1, информации2 и Information3 можно поставить в качестве статической переменной класса, так что может быть легко ссылаться и предотвратить человеческий опечатка ошибка.

+0

Йода, ты! – dty

+0

Еще один новый ник, который я получил сегодня! – Jasonw

0

Вы можете использовать оператор switch в Java 7.here

0

Лучше использовать коммутационный футляр, из-за проверки unnesessery, если первая или вторая проверка верна. В разделе по умолчанию вы можете поместить другие действия, такие как выброс исключений или так далее.

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