
Какие системы контроля версий вы знаете?
Git, SVN, Bazaar, Mercurial
Чем отличаются SVN и Git?
GIT — распределенная СКВ, а SVN — нет. Другими словами, если есть несколько разработчиков работающих с репозиторием у каждого на локальной машине будет ПОЛНАЯ копия этого репозитория. Разумеется есть и центральная машина, с которой можно клонировать репозиторий. Это напоминает SVN. Основной плюс Git в том, что если вдруг у вас нет доступа к интернету, сохраняется возможность работать с репозиторием. Потом только один раз сделать синхронизацию и все остальные разработчики получат полную историю.
GIT сохраняет метаданные изменений, а SVN целые файлы. Это экономит место и время.
Что такое GitHub? У вас есть проекты на GitHub?
GitHub — веб-сервис хостинга проектов с использованием системы контроля версий git, а также как социальная сеть для разработчиков. Пользователи могут создавать неограниченное число репозиториев, для каждого из которых предоставляется wiki, система issue tracking-а, есть возможность проводить code review и т.п. Кроме Git, сервис поддерживает получение и редактирование кода через SVN и Mercurial.
Зачем нужны системы контроля версий?
СКВ дает возможность возвращать отдельные файлы к прежнему виду, возвращать к прежнему состоянию весь проект, просматривать происходящие со временем изменения, определять, кто последним вносил изменения во внезапно переставший работать модуль, кто и когда внес в код какую-то ошибку, и т.п.. Вообще, если, пользуясь СКВ, вы всё испортите или потеряете файлы, всё можно будет легко восстановить.
Что такое generic? Как они реализованы в Java?
Generics — это параметризованные типы. С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра. Обобщения добавили в язык безопасность типов.
Пример реализации:
class MyClass<T>{ T obj; public MyClass(T obj){ this.obj = obj; } } class MyClass<T>
В угловых скобках используется T — имя параметра типа. Это имя используется в качестве заполнителя, куда будет подставлено имя реального типа, переданного классу
MyClass
при создании реальных типов. То есть параметр типаT
применяется в классе всякий раз, когда требуется параметр типа. Угловые скобки указывают, что параметр может быть обобщен. Сам класс при этом называется обобщенным классом или параметризованным типом.Далее тип
T
используется для объявления объекта по имениobj
:T obj;
Вместо
T
подставится реальный тип, который будет указан при создании объекта классаMyClass
. Объектobj
будет объектом типа, переданного в параметре типаT
. Если в параметреT
передать типString
, то экземплярobj
будет иметь типString
.Рассмотрим конструктор
MyClass()
:public MyClass(T obj){ this.obj = obj; }
Параметр
obj
имеет типT
. Это значит, что реальный тип параметраobj
определяется типом, переданным параметром типаT
при создании объекта классаMyClass
.Параметр типа
T
также может быть использован для указания типа возвращаемого значения метода.В именах переменных типа принято использовать заглавные буквы. Обычно для коллекций используется буква
E
, буквамиK
иV
— типы ключей и значение (Key/Value), а буквойT
(и при необходимости буквыS
иU
) — любой тип.Обобщения работают только с объектами. Поэтому нельзя использовать в качестве параметра элементарные типы вроде
int
илиchar
.*Так же считаю нужным упомянуть generic методы. Это методы вида:
модификаторы <T, ...> возвращаемыйТип имяМетода(T t, ...)
Как я понял, если в качестве типа в сигнатуре метода используются параметры, необходимо перед типом возвращаемого значения их перечислить. Верно ли это?
Более подробную информацию можно посмотреть по следующим ссылкам:
Что такое стирание типов?
Внутри класса-дженерика не хранится информация о его типе параметре. Это и называется стиранием типов. На стадии компиляции происходит приведение объекта класса к типу, который был указан при объявлении.
Пример:
Что такое wildcard?
Wildcard — это дженерик вида <?>, что означает, что тип может быть чем угодно. Используется, например, в коллекциях, где для всех коллекций базовым типом является Сollection<?>.
Полезная ссылка: Теория и практика Java. Эксперименты с generic-методами
Расскажите про extends и super в Generic'ах?
Чтобы наложить ограничение на wildcard необходимо использовать конструкции типа:
? extends SomeClass
— означает, что может быть использован любой класс-наследник SomeClass? super SomeClass
— означает, что может быть использован класс SomeClass, либо класс-родитель (или интерфейс) SomeClass
Это называется bounded wildcard.
Для того, чтобы определиться с выбором между
extends
иsuper
был придуман метод PECS.Подробно про это можно прочитать по ссылке ниже: Использование generic wildcards для повышения удобства Java API
Как использовать wildcard?
Пример использования wildcard:
List<?> numList = new ArrayList<Integer>();
Вопрос я не понял, но в принципе использование wildcard’ов рассматривается в материалах по ссылкам выше.
В чем отличие ArrayList и ArrayList<?>
Запись вида ArrayList называется raw type (обычный тип). Она эквивалентна записи вида ArrayList<T> и используется для обратной совместимости, т.к. до Java 1.5 не было дженерик коллекций. По возможности такой формы записи следует избегать.
ArrayList<?> является супертипом для ArrayList.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Сам для себя пока нашёл одно отличие между ArrayList и ArrayList<?>: в список типа ArrayList можно вставить элемент любого типа, а в список типа ArrayList<?> — только null. А вот подстановка списков с конкретным типом переменных вместо параметров с данными типами — происходит одинаково. Кроме того, чтение данных из списков этих двух типов тоже проходит одинаково (и в обоих случаев это происходит без проблем).
И ещё, такое предложение: «Сам класс при этом называется обобщенным классом или параметризованным типом.» Параметрическим типом как раз явлется тип, указываемый в угловых скобках (его ещё называют типо-параметром).
«Git хранит „слепки“ файлов в сжатом виде (причём, если файл не менялся, то хранится ссылка на него), а SVN хранит изменения файлов.» Тут например есть про это. И вот ещё ссылки про сравнение этих двух СКВ: первая, вторая
Но если говорить вообще, то чёткого сравнения в интернете я и не нашёл. А некоторые статьи и высказывания, как я понял, уже устарели. Вот что у меня получилось по пунктам:
а) SVN — централизованная СКВ, а Git — распределённая СКВ. Соответственно, гит хранит все файлы и всю историю на локальном диске, SVN — же на сервере.
б) Git хранит «слепки» файлов в сжатом виде (причём, если файл не менялся, то хранится ссылка на него), а SVN хранит изменения файлов.
в) В Git коммит может иметь несколько родителей (разных веток) и несколько потомков (разных веток), а в SVN — нет. Соответственно, в SVN — линейная история коммитов, а в Git — нет.
г) В Git ветка — это просто указатель на какой-то коммит, в SVN — это полноценная копия всего репозитория. (?)
д) Git создают одну скрытую папку в корне проекта, в которой хранит всю свою служебнуюинформацию, а SVN в каждой папке проекта создаёт скрытую папку со своей служебной информацией. (?)
Последние два пункт с вопросами, потому что по ним несколько противоречивая информация (думаю, из-за разных версий SVN, которыми пользовались люди).