That sounds like a need for named and default constructor parameters. With the two of those, you can mix-and-match whatever values you want, with non-defaulted ones being required. And since the parameters are named, they self-document at the usage site.