That makes sense to me.
In particular, you can add enough logic to Main to parse the command line arguments - perhaps using a generic argument parser - and then pass these parameters to the constructor in a strongly typed way, suitable for the program in question.
Albin asked why this was necessary. In a word: verifiability. In some cases, it is entirely possible to at least test some aspects of a top-level program with unit tests or, possibly, integration tests. Using instance fields instead of static fields (etc.) improves testability here, since you don't have to worry about previous test runs ruining the state.
source share