# The collision the default key generator makes easy countLetters(String) and countDigits(String) both write into cache "shared". countLetters("a1b2") -> letters=2 (repository calls: letters=1 digits=0) countDigits("a1b2") -> letters=2 (repository calls: letters=1 digits=0) countDigits never ran. It found the key "a1b2" already populated and returned the answer to a different question. cache "shared": key a1b2 [String] -> letters=2 --- no-argument methods collide even harder --- currentBanner() -> banner-from-currentBanner currentFooter() -> banner-from-currentBanner <- both key on SimpleKey.EMPTY cache "noargs": key SimpleKey [] [SimpleKey] -> banner-from-currentBanner --- the fix: put the method into the key --- countLettersScoped("a1b2") -> letters=2 countDigitsScoped("a1b2") -> digits=2 cache "scoped": key digits:a1b2 [String] -> digits=2 key letters:a1b2 [String] -> letters=2