As you say, 20 fields is a lot for a constructor. Regarding readability, the pattern that comes to my mind is static factory methods (but in the sense of Joshua Bloch's Effective Java, not the Factory Method of GoF book).
As he says in the book (in its Item 1), static factory methods have names (unlike constructors) so that a static method with a well-chosen name is easier to use and the resulting client code easier to read.
class ManyFields {
T a;
U b;
(...)
V t;
}
That way, you could do things like
ManyFields.withAtoFzeroed(g, h, i, ..., t)
ManyFields.onlyGandJ(g, j)
ManyFields.consonantsZeroed(a, e, i, o, u)
(...)
That is, adapt/coin new static factory methods addressing different usage patterns in your code is easier to do and more readable.
Of course, having a set of default values would help on that, since the number of parameters needed in those methods would be reduced.
Besides, static factory methods do not have to create a new object each time they’re invoked, allowint predefined instances, caching, etc. As a result, if equivalent objects are requested often, you can improve performance with this technique, apart from highlighting the most typical objects used for your class.
Nevertheless, the efectiveness (in terms of readability) of a bunch of static factory methods usually depends on how well you can group those parameters in terms of common values, default values, etc. which usually arises the need of splitting such a big class into smaller classes and using composition (as @dkaztel suggests).
Anyway, when dealing with many constructor parameters, the best approach is usually a Builder.
Given you want to avoid it, you can improve also the readability using method chaining for your setters.
ManyFields obj = new ManyFields();
obj.a(A).b(B).d(D).t(T).v(V).f(F);
This answer about builders and fluent interfaces can also be useful.