Как правильно передать данные в фрагмент?

Самый популярный вопрос на собеседовании про фрагменты причем спрашивают как у джунов, так и у сеньоров. Давайте разбираться как?
Допустим нам нужно передать id во фрагмент. Нужно понимать принципиальную разницу м/у Activity и фрагментом. Activity мы не создаем сами, это компонент приложения, а значит система его создает сама когда нужно. Фрагмент же мы создаем сами (по крайней мере первый раз) и затем отправляем его в Fragment Manager.
Если мы создаем фрагмент сами, значит мы можем просто добавить этот id в конструктор фрагмента, например так:

Это даже будет работать, но только при первом показе. Теперь вспоминаем, что происходит при пересоздании Activity? Как я говорил Fragment Manager сам восстанавливает фрагменты, а делает он это при помощи рефлексии. Fragment Manager просто забьёт на ваш конструктор и вызовет стандартный, без аргументов. И когда вы попытаетесь обратиться к этому полю приложение тупо упадет.

Именно поэтому мы используем Bundle(), у фрагмента если специальное поле arguments:

Именно поэтому мы делаем вот такие методы newInstance во фрагментах. Причем это негласный контракт, делать метод newInstance во всех фрагментах. При пересоздании Activity arguments сохраняются и мы можем их использовать.
Есть способ сделать так, чтобы можно было передавать данные во фрагмент через конструктор. Для этого нужно использовать такую штуку как Fragment Factory. Разбирать этот способ тут не буду, по мне так это извращение.