#java #классы #static #шаблон_одиночка
Столкнулся с задачей, которую в равной степени можно решить двумя способами. Класс,
допустим DeviceState обращается к устройству десятки раз в секунду, поэтому каждый
раз создавать экземпляр не вариант.
Нужно использовать или синглтон или сделать класс статическим. И так и так работает.
Не могу определиться с выбором. По удобству, вроде как, статический выигрывает. Есть
ли какая-то разница по памяти и в быстродействии?
//singleton
DeviceState ds = ModbusMaster.getDeviceState(); //там происходит return DeviceState.getInstance(connParams);
System.out.println(ds.getLedState());
//full static
DeviceState.refreshData();
System.out.println(DeviceState.ledState);
Ответы
Ответ 1
Думаю, в вашем случае лучше всё-таки использовать синглтон. Вот хорошая статья на эту тему: Если Ваш синглтон не поддерживает ни одного состояния, а просто обеспечивает доступ к методам, лучше рассмотреть использование статического класса, так как статические методы гораздо быстрее синглтона, благодаря статичному связыванию во время компиляции. Если по Вашим требованиям необходимо поддержать состояние, то в таком случае синглтон является лучшим выбором, чем статический класс, потому что поддержание состояния в последнем случае — кошмар, и ведет к неочевидным ошибкам. А так как у вас сам класс называется DeviceState, думаю, он должен поддерживать разные состояния, значит, нужен синглтон. Что касается производительности: Статический класс предоставляет большую производительность, чем синглтон, потому что статические методы связываются во время компиляции. Но думаю, что особенной разницы в производительности вы не заметите, а стилистически правильнее будет использовать синглтон.Ответ 2
По производительности и памяти в вашем случае статика не будет отличаться от синглтона. Имеет смысл использовать именно второй подход (Singletone) т.к. это даст вам возможность в дальнейшем использовать преимущества полиморфизма. В тестовом окружении например можно будет заменить имплементацию DeviceState на "заглушку" с необходимой для теста логикой, либо менять реализацию в зависимости от типа устройства с которым общается DeviceState.Ответ 3
Не думайте, как быстрее (до того, как вы провели профилирование), думайте, как правильно. Статический метод в DeviceState означает, что метод относится ко всем возможным DeviceState. Синглтон означает, что у вас есть ровно один DeviceState, и ваши вызываемые методы относятся в точности к нему. В вашем случае у вас именно второй вариант: у вас одно устройство. Вот и используйте синглтон. Вы не должны задаваться вопросом «как быстрее». Если писать всё «как быстрее», то не нужны ни классы, ни методы, а лишь один большой метод с goto. Улучшать производительность заранее не имеет смысла, «преждевременная оптимизация — источник всех бед». Ну и несчастная сотня вызовов в секунду — это так мало, что разницу в скорости не заметит никто.
Комментариев нет:
Отправить комментарий