Additionally, if the full path is passed into the constructor, is there a good reason to read the json, parse it and create the new config object every time this method is called? It looks like you're assuming a particular structure to the config (All and the various environments at the top level), and to me that implies that most, if not all, of this work could be done on creation instead. The only reason I'd see to not do it is if you want to be able to update the config at runtime, but if that's the case I think there are some better architectural approaches to config invalidation utilizing things like filesystem watchers.