337 karma · joined April 10, 2015
As an anecdote, I am immensely susceptible to falling asleep when reading in the dark with the Paperwhite.
Your example of getters and setters is a bit of a red herring. I understand what you mean by it, but it doesn't apply in this case. This is because the getter and setter is an abstraction that derives from encapsulation. But it is also an antipattern. In many cases, getters and setters are just a type of needless complexity--a distraction, overengineering! On the other hand, DI solves a real, practial problem, and if your language is intelligent, it is really simple to implement.
It all boils down to this.
Here's the catch, though: with dependencies, it is really, really hard to know whether dependency implementations change or not. What is more, in most languages, implementing dependency injection is so trivial that it is always worth it. Conversely, the work associated with changing implementations that aren't built with some form of loose coupling, that is, designing around DI, is in most cases non-trivial.
[0] "Cardinal Numerals: Old English from a Cross-Linguistic Perspective", http://bit.ly/1HhPzOB, page 161.