It's pretty common to need to do something to your user object if it does exist. As a toy example, it's far better to have something like (using Scala syntax here):
def getUserGreeting(userDao: UserDAO)(username: String): String =
userDao.getOptionalUser(username) match {
case Some(user) => "Hello, " + user.getFullName
case None => "Not logged in"
}
than: def getUserGreeting(userDao: UserDAO)(username: String): String =
if(userDao.doesUserExist(username)) match {
"Hello, " + userDao.get(username).getFullName
} else {
"Not logged in"
}
For one thing, the first function probably only makes one database call, while the second (absent caching) makes two. Secondly, the second carries with it the (unlikely) possibility that the user is deleted between your DAO calls. Thirdly, I would argue that the first function is easier to read.