downcasting (т.е. бросающий к производному типу) ВСЕГДА неправильно? [закрытый]

5
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Нет, это определенно не всегда неправильно.

Например, предположим, что в C # у вас есть обработчик событий, который получает параметр отправителя , представляющий отправителя события. Теперь вы можете подключить этот обработчик событий к нескольким кнопкам, но вы знаете, что они всегда кнопки. Разумно преобразовать отправителя в кнопку в этом коде.

Это только один пример - есть много других. Иногда это просто способ обойти немного неудобный API, в других случаях это происходит из-за невозможности четко выразить тип в нормальной системе типов. Например, у вас может быть соответствующий инкапсулированный Dictionary , с универсальными методами для добавления и извлечения значений - где значение записи имеет тип ключа. Приведение здесь совершенно естественно - вы можете видеть, что оно всегда будет работать, и это обеспечивает большую безопасность типов для остальной системы.

8
ответ дан 13 December 2019 в 05:34
поделиться

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

Проверьте, что они делают при поиске контакта.

-121--3713217-

Если автоматизированному сценарию необходимо запустить что-либо с паролем, то необходимо либо обеспечить его считывание сценарием (что открывает возможность его чтения кем-либо другим), либо не предоставить его в автоматическом режиме.

Хитрость состоит в том, чтобы обойти часть «Автоматизация», имея однократный запуск: запустить сценарий как небольшой непрерывный процесс, который будет периодически просыпаться и запускаться. Попросите процесс ввести пароль при запуске или через другой вид запроса API (не в командной строке!).

Если сервер перезагружается, пароль теряется до тех пор, пока вы не войдете в систему и не введете пароль снова. Таким образом, пароль находится только в памяти, а не в файловой системе.

Может потребоваться, чтобы cron-задание проверяло процесс и предупреждало, если он не запущен.

-121--5086040-

Это никогда не является идеальным решением и его следует избегать везде, где это возможно - если только альтернатива не будет хуже. Иногда этого невозможно избежать, например, библиотека Java Standard API pre-Generics имела множество классов (наиболее заметных коллекций), которые требовали понижения, чтобы быть полезными. И иногда, изменение конструкции, чтобы избежать downcast значительно усложняет его, так что downcast является лучшим решением.

3
ответ дан 13 December 2019 в 05:34
поделиться

Примером «легального» понижающего преобразования является версия Java pre 5.0, в которой при доступе к элементам контейнера приходилось понижать их до их конкретного типа. В этом контексте это было неизбежно. Это также показывает и другую сторону вопроса: если вам нужно сильно упасть в данной ситуации, это начинает плохо, поэтому лучше найти другое решение, не понижая. Это привело к появлению универсальных шаблонов в Java 5.

Джон Влиссидес много анализирует эту проблему (также известную как «Отмывание типов») в своей превосходной книге Pattern Hatching (практически продолжении Design Patterns). ).

1
ответ дан 13 December 2019 в 05:34
поделиться