In addition to Derek's answer, consider the builder pattern public class WrapperA { ClassA classA ClassB classB public WrapperA withclassA(ClassA val) {this.classA = val; return this;} public WrapperB withclassA(ClassB val) {this.classB = val; return this;} } public class ClassA { String sc; String rs; String ss; public ClassA withSc(String val) {this.sc = val; return this;} public ClassA withRs(String val) {this.rs = val; return this;} public ClassA withSs(String val) {this.ss = val; return this;} } public class ClassB { .. similar to ClassA } and then you can instantiate in one statement WrapperA wrapA = new WrapperA() .withClassA(new ClassA() .withRs('abc') .withSc('def' .withSS('ghi') ) .withClassB(new ClassB() .withXX(..) ... ); This approach avoids too many arg methods that can be flagged by static code analyzers; is infinitely extensible, is very readable, avoids having to know the order of arguments, makes setting up testmethods easier, and provides other benefits of a facade between the object and how it is invoked (i.e. supporting default values)