Этот вопрос очень похож на , Объект 29 в Эффективном Java - "Рассматривает безопасные с точки зрения типов неоднородные контейнеры". Ответ Laz является самым близким к решению Bloch. Однако оба помещенные и добираются, должен использовать литерал Класса для безопасности. Подписи стали бы:
public void addFriend(String name, Class type, T animal);
public T callFriend(String name, Class type);
Внутренняя часть оба метода необходимо проверить, что параметры нормальны. Посмотрите Эффективный Java и Класс javadoc для большего количества информации
На самом деле DVCS значительно упростил непрерывную интеграцию.
С центральной VCS каждый разработчик имеет права на фиксацию непосредственно в транке и, следовательно, он может коммитить ошибочный код. CI обнаружит это постфактум. Таким образом, можно сломать транк даже с CI.
С другой стороны, основные операции в мире DVCS - это ветвление и слияние. Поскольку слияние является явным и представляет собой отдельный процесс по сравнению с фиксацией в стволе, всегда можно проверить результат слияния до того, как оно попадет в ствол. У меня нет опыта работы с Git, но разработчики Bazaar VCS успешно использовали эту технику как минимум 3,5 года с помощью инструмента PQM.
В основном рабочий процесс PQM выглядит следующим образом: разработчик публикует свою ветку, чтобы ее можно было объединить, затем он отправляет специальное электронное письмо боту PQM с инструкциями по слиянию. Когда PQM получает запрос на слияние, он создает отдельную ветвь интеграции (копию магистрали), затем объединяет ветку разработчика и запускает тесты для полученного кода. Если все тесты пройдены, интеграционная ветвь перемещается в магистраль, в противном случае разработчик получит электронное письмо с журналом неудачных тестов.
Выполнение всех тестов для проекта Bazaar требует времени, но тесты выполняются по запросу на отдельный сервер. Разработчики не будут заблокированы слиянием и смогут продолжить работу над другими задачами.
В результате рабочего процесса слияния на основе PQM магистраль bzr никогда не нарушается (по крайней мере, пока имеется достаточное количество приемочных и регрессионных тестов).
затем объединяет ветку разработчика и запускает тесты на полученном коде. Если все тесты пройдены, интеграционная ветвь перемещается в магистраль, в противном случае разработчик получит электронное письмо с журналом неудачных тестов.Выполнение всех тестов для проекта Bazaar требует времени, но тесты выполняются по запросу на отдельный сервер. Разработчики не будут заблокированы слиянием и смогут продолжить работу над другими задачами.
В результате рабочего процесса слияния на основе PQM магистраль bzr никогда не нарушается (по крайней мере, пока имеется достаточное количество приемочных и регрессионных тестов).
затем объединяет ветку разработчика и запускает тесты на полученном коде. Если все тесты пройдены, интеграционная ветвь перемещается в магистраль, в противном случае разработчик получит электронное письмо с журналом неудачных тестов.Выполнение всех тестов для проекта Bazaar требует времени, но тесты выполняются по запросу на отдельный сервер. Разработчики не будут заблокированы слиянием и смогут продолжить работу над другими задачами.
В результате рабочего процесса слияния на основе PQM магистраль bzr никогда не нарушается (по крайней мере, пока имеется достаточное количество приемочных и регрессионных тестов).
но тесты выполняются по запросу на отдельном сервере. Разработчики не будут заблокированы слиянием и смогут продолжить работу над другими задачами.В результате рабочего процесса слияния на основе PQM магистраль bzr никогда не нарушается (по крайней мере, пока имеется достаточное количество приемочных и регрессионных тестов).
но тесты выполняются по запросу на отдельном сервере. Разработчики не будут заблокированы слиянием и смогут продолжить работу над другими задачами.В результате рабочего процесса слияния на основе PQM магистраль bzr никогда не нарушается (по крайней мере, пока имеется достаточное количество приемочных и регрессионных тестов).
Поскольку все DVCS могут использоваться с рабочим процессом, использующим централизованный репозиторий, проблем нет. Политика диктует, что разработчик должен отправлять свои изменения в центральный репозиторий точно так же, как политика диктует фиксации в нераспределенной VCS. Дополнительные инструменты, которые позволяют разработчику редактировать наборы исправлений, никоим образом не являются помехой и фактически значительно упрощают создание поддерживаемой базы кода.
Использование DVCS, например Git, не мешает вам регулярно выполнять фиксацию в центральном репозитории. Однако это означает, что вы можете делать промежуточные коммиты локально и отправлять изменения в центральный репозиторий только после того, как закончите.
Таким образом, вы получаете преимущества от контроля версий, даже когда вы на полпути к реализации функции, не нарушая сборка для других разработчиков.
Инструменты непрерывной интеграции, такие как Hudson, поддерживают DVCS, поэтому я подозреваю, что это возможно для согласования непрерывной интеграции с распределенным контролем версий.
Во-первых, я думаю, что с DVCS, использующим такие рабочие процессы, как рабочий процесс ветки темы, CI может быть менее необходимым . Во-вторых, вы можете настроить (единый, центральный) репозиторий непрерывной интеграции, в который вы нажимаете, когда будете готовы, и хуки будут выполнять CI.
Добавлено 07-08-2009:
См., Например, Continuous Integration Spring Очистка сообщения в блоге GitHub.
Две идеи, которые я нашел, помогают объяснить это :
Таким образом, суть вопроса заключается в том, как выполняется слияние репозиториев, для которых вы хотите запустить инструмент CI. При запуске вы можете выбрать только одно хранилище.