Argument reordering with implicit arguments is another nice one.
This code:
def foo(Map m=[:], String msg, int val, Closure c={}) {
[...]
}
Creates all these different methods:
foo("msg", 2, x:1, y:2)
foo(x:1, y:2, "blah", 2)
foo("blah", x:1, 2, y:2) { [...] }
foo("blah", 2) { [...] }
And more. It's impossible to screw up by putting named and ordinal arguments in the wrong order/position.
Of course, in the definition of "foo", you can leave off "String" and "int" from "String msg" and "int val" -- I left them in just for clarity.