true and false are lousy arguments is probably the easiest to implement and most helpful tip on this list. I can't count how many times I have been reading a piece of code and forgotten what the "true" indicated in a call, or even seen code like:
Frobnitz(true, true, false);
Maybe in Eclipse/NetBeans/etc, that code is meaningful with context-assist, but it certainly isn't readable for me. This also reminds me of a point that I can't seem to find in this list - "Options" objects help more in simplifying interfaces/configurations than many other solutions. It changes something like:
Foo foo = new Foo(someObject, 3, 42, Foo.USE_FROBNOB, 27);
into
Foo.Options opts = Foo.newDefaultOptions()
.handler(someObject)
.numThreads(3)
.maxConnections(42)
.build();
Foo foo = new Foo(opts);
And allows for easy removal/addition of params.