learning modern java patters