these instance vars should be private; could chain all constructor calls so the one which takes all arguments can allow those to be null

in the constructors any values that should never be null could be checked with Assert.notNull

I did notice that in subclasses there are places where those variables are assumed to never be null (else NullPointerExceptions could occur)