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)