refactor
split constructor and make fields final