Как мне обрабатывать строковые элементы типа в моем коде, чтобы они были согласованы между приложениями? - PullRequest
0 голосов
/ 13 июня 2018

Это может показаться глупым вопросом, но мне не совсем понятно, как это следует обрабатывать в Java-коде:

У меня есть несколько устройств, которые взаимодействуют с моей системой через API.У каждого из них есть тип, например, TV, SmartPhone, Laptop.
Мой код должен выполнять множество разных действий в зависимости от этого типа.Это относится к ряду других серверов в системе.
Записи, относящиеся к каждому устройству, хранятся в базе данных, включая тип.

В настоящее время я делаю статический класс со ссылками на каждый тип, например:

DeviceType.SMART_PHONE

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

if(device.getType().equals(DeviceType.SMART_PHONE){
    // stuff happens
}

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

Какая лучшая практика для подобных вещей?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Для меня это выглядит как шаблон стратегии , поскольку вы делаете что-то свое для каждого DeviceType.В таком случае у вас может быть общий интерфейс, который будет выполнять stuff happens (что бы это ни было).Например:

// if you have java-8, this could be replaced with java.util.Consumer for example
interface Handler {
    public void handle();
}

, тогда вы можете создать все необходимые обработчики.

static class SmartPhoneHandler implements Handler {
     public void handle(){
        // handle smart phone logic here
     }
}

Вам необходимо зарегистрировать их на Map:

Map<DeviceType, Handler> strategies = new HashMap<>(); // or EnumMap in case DeviceType is an enum
strategies.put(DeviceType.SmartPhone, new SmartPhoneHandler());
// all others like this

позднее использование будет:

strategies.get(device.getType()).handle()

Если вам нужны некоторые параметры в качестве входных данных для метода handle - вам следует создать другой держатель с именем StrategyContext, который будет принимать в качестве входных данных необходимые параметры, например:

 static class StrategyContext {
     private final int deviceId; // for example
     // .... constructor/getters 
 }    

и, следовательно, ваш метод handle изменится на:

handle(StrategyContext context)
0 голосов
/ 13 июня 2018

Я думаю, что лучшим решением было бы создание enum 'DeviceType' со всеми определенными типами.Таким образом, вы можете быть уверены, что эти статические финалы не будут везде в проекте.Это также предотвратит глупые орфографические ошибки или другие ошибки, связанные со строковыми константами, определенными во всем проекте.

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