Да, их можно обойти. Пример внедрения зависимости, который вы указали, на самом деле является полезным примером обхода. Инъекция частным пользователям не загрязняет интерфейсы и не так легко запутаться во время выполнения. Однако, чтобы увидеть основное преимущество, подумайте о том, что вы разработчик программного обеспечения и возглавляете очень ленивую или неопытную команду.
Помните, что хорошо обработанные объекты должны иметь высокую когезию и слабую связь. Высокая сплоченность означает, что объект имеет дело с проблемами, с которыми он семантически предназначен для решения, ни больше, ни меньше. Слабая связь означает, что объекты зависят от интерфейсов, а не от конкретных реализаций. Помните, что преимущество в этом состоит в том, что он делает ваш код намного проще для чтения, понимания, тестирования и изменения. Это снижает стоимость и в целом делает заинтересованных сторон счастливыми. Как архитектор, это то, что вас волнует. Гипотетическая ленивая / неопытная команда, о которой идет речь, заботится только о том, чтобы немедленно завершить все задачи, стоящие в их очереди, даже за счет качества и будущей производительности.
Модификаторы доступа показывают некоторые намерения за интерфейсом, определенным для объекта. Обычно, если вы пишете хорошо продуманный код, вам почти всегда нужны только публичные и приватные модификаторы. В редком случае, когда проблема не может быть легко / четко разделена на один сплоченный объект, существует также ключевое слово «защищенный», которое позволяет ограничить внешний доступ к объектам, которые должны логически разделять данную проблему.
Лучший, хотя и, возможно, более громоздкий способ выражения намерения за интерфейсом - это проектирование по контракту , в котором используется гораздо более надежный набор аннотаций интерфейса, чтобы инструменты предварительной обработки могли применять правила интерфейса .
ТЛ; др:
Замечательное применение компилятором модификаторов доступа. Компилятор создает довольно хороший барьер неудобств для тех, кто в противном случае был бы рад уменьшить сплоченность и увеличить сцепление вашей кодовой базы, чтобы быстрее вычеркнуть их непосредственную задачу.