You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2018/10/30 16:53:30 UTC

[03/13] logging-log4j2 git commit: Use final.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/de97a11d/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
index a4cc8d2..f61d216 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
@@ -139,11 +139,11 @@ public class CommandLine {
     private String commandName = Help.DEFAULT_COMMAND_NAME;
     private boolean overwrittenOptionsAllowed = false;
     private boolean unmatchedArgumentsAllowed = false;
-    private List<String> unmatchedArguments = new ArrayList<String>();
+    private final List<String> unmatchedArguments = new ArrayList<String>();
     private CommandLine parent;
     private boolean usageHelpRequested;
     private boolean versionHelpRequested;
-    private List<String> versionLines = new ArrayList<String>();
+    private final List<String> versionLines = new ArrayList<String>();
 
     /**
      * Constructs a new {@code CommandLine} interpreter with the specified annotated object.
@@ -152,7 +152,7 @@ public class CommandLine {
      * @param command the object to initialize from the command line arguments
      * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation
      */
-    public CommandLine(Object command) {
+    public CommandLine(final Object command) {
         interpreter = new Interpreter(command);
     }
 
@@ -197,8 +197,8 @@ public class CommandLine {
      * @since 0.9.7
      * @see Command#subcommands()
      */
-    public CommandLine addSubcommand(String name, Object command) {
-        CommandLine commandLine = toCommandLine(command);
+    public CommandLine addSubcommand(final String name, final Object command) {
+        final CommandLine commandLine = toCommandLine(command);
         commandLine.parent = this;
         interpreter.commands.put(name, commandLine);
         return this;
@@ -259,9 +259,9 @@ public class CommandLine {
      * @return this {@code CommandLine} object, to allow method chaining
      * @since 0.9.7
      */
-    public CommandLine setOverwrittenOptionsAllowed(boolean newValue) {
+    public CommandLine setOverwrittenOptionsAllowed(final boolean newValue) {
         this.overwrittenOptionsAllowed = newValue;
-        for (CommandLine command : interpreter.commands.values()) {
+        for (final CommandLine command : interpreter.commands.values()) {
             command.setOverwrittenOptionsAllowed(newValue);
         }
         return this;
@@ -288,9 +288,9 @@ public class CommandLine {
      * @since 0.9.7
      * @see #getUnmatchedArguments()
      */
-    public CommandLine setUnmatchedArgumentsAllowed(boolean newValue) {
+    public CommandLine setUnmatchedArgumentsAllowed(final boolean newValue) {
         this.unmatchedArgumentsAllowed = newValue;
-        for (CommandLine command : interpreter.commands.values()) {
+        for (final CommandLine command : interpreter.commands.values()) {
             command.setUnmatchedArgumentsAllowed(newValue);
         }
         return this;
@@ -325,8 +325,8 @@ public class CommandLine {
      * @throws ParameterException if the specified command line arguments are invalid
      * @since 0.9.7
      */
-    public static <T> T populateCommand(T command, String... args) {
-        CommandLine cli = toCommandLine(command);
+    public static <T> T populateCommand(final T command, final String... args) {
+        final CommandLine cli = toCommandLine(command);
         cli.parse(args);
         return command;
     }
@@ -345,7 +345,7 @@ public class CommandLine {
      * @throws ParameterException if the specified command line arguments are invalid; use
      *      {@link ParameterException#getCommandLine()} to get the command or subcommand whose user input was invalid
      */
-    public List<CommandLine> parse(String... args) {
+    public List<CommandLine> parse(final String... args) {
         return interpreter.parse(args);
     }
     /**
@@ -407,7 +407,7 @@ public class CommandLine {
      * @since 2.0 */
     public static class DefaultExceptionHandler implements IExceptionHandler {
         @Override
-        public List<Object> handleException(ParameterException ex, PrintStream out, Help.Ansi ansi, String... args) {
+        public List<Object> handleException(final ParameterException ex, final PrintStream out, final Help.Ansi ansi, final String... args) {
             out.println(ex.getMessage());
             ex.getCommandLine().usage(out, ansi);
             return Collections.emptyList();
@@ -429,8 +429,8 @@ public class CommandLine {
      * @param ansi for printing help messages using ANSI styles and colors
      * @return {@code true} if help was printed, {@code false} otherwise
      * @since 2.0 */
-    public static boolean printHelpIfRequested(List<CommandLine> parsedCommands, PrintStream out, Help.Ansi ansi) {
-        for (CommandLine parsed : parsedCommands) {
+    public static boolean printHelpIfRequested(final List<CommandLine> parsedCommands, final PrintStream out, final Help.Ansi ansi) {
+        for (final CommandLine parsed : parsedCommands) {
             if (parsed.isUsageHelpRequested()) {
                 parsed.usage(out, ansi);
                 return true;
@@ -441,19 +441,19 @@ public class CommandLine {
         }
         return false;
     }
-    private static Object execute(CommandLine parsed) {
-        Object command = parsed.getCommand();
+    private static Object execute(final CommandLine parsed) {
+        final Object command = parsed.getCommand();
         if (command instanceof Runnable) {
             try {
                 ((Runnable) command).run();
                 return null;
-            } catch (Exception ex) {
+            } catch (final Exception ex) {
                 throw new ExecutionException(parsed, "Error while running command (" + command + ")", ex);
             }
         } else if (command instanceof Callable) {
             try {
                 return ((Callable<Object>) command).call();
-            } catch (Exception ex) {
+            } catch (final Exception ex) {
                 throw new ExecutionException(parsed, "Error while calling command (" + command + ")", ex);
             }
         }
@@ -482,7 +482,7 @@ public class CommandLine {
          *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed
          */
         @Override
-        public List<Object> handleParseResult(List<CommandLine> parsedCommands, PrintStream out, Help.Ansi ansi) {
+        public List<Object> handleParseResult(final List<CommandLine> parsedCommands, final PrintStream out, final Help.Ansi ansi) {
             if (printHelpIfRequested(parsedCommands, out, ansi)) { return Collections.emptyList(); }
             return Arrays.asList(execute(parsedCommands.get(0)));
         }
@@ -533,9 +533,9 @@ public class CommandLine {
          *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed
          */
         @Override
-        public List<Object> handleParseResult(List<CommandLine> parsedCommands, PrintStream out, Help.Ansi ansi) {
+        public List<Object> handleParseResult(final List<CommandLine> parsedCommands, final PrintStream out, final Help.Ansi ansi) {
             if (printHelpIfRequested(parsedCommands, out, ansi)) { return Collections.emptyList(); }
-            CommandLine last = parsedCommands.get(parsedCommands.size() - 1);
+            final CommandLine last = parsedCommands.get(parsedCommands.size() - 1);
             return Arrays.asList(execute(last));
         }
     }
@@ -559,12 +559,12 @@ public class CommandLine {
          *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed
          */
         @Override
-        public List<Object> handleParseResult(List<CommandLine> parsedCommands, PrintStream out, Help.Ansi ansi) {
+        public List<Object> handleParseResult(final List<CommandLine> parsedCommands, final PrintStream out, final Help.Ansi ansi) {
             if (printHelpIfRequested(parsedCommands, out, ansi)) {
                 return null;
             }
-            List<Object> result = new ArrayList<Object>();
-            for (CommandLine parsed : parsedCommands) {
+            final List<Object> result = new ArrayList<Object>();
+            for (final CommandLine parsed : parsedCommands) {
                 result.add(execute(parsed));
             }
             return result;
@@ -607,7 +607,7 @@ public class CommandLine {
      * @see RunLast
      * @see RunAll
      * @since 2.0 */
-    public List<Object> parseWithHandler(IParseResultHandler handler, PrintStream out, String... args) {
+    public List<Object> parseWithHandler(final IParseResultHandler handler, final PrintStream out, final String... args) {
         return parseWithHandlers(handler, out, Help.Ansi.AUTO, new DefaultExceptionHandler(), args);
     }
     /**
@@ -652,11 +652,11 @@ public class CommandLine {
      * @see RunAll
      * @see DefaultExceptionHandler
      * @since 2.0 */
-    public List<Object> parseWithHandlers(IParseResultHandler handler, PrintStream out, Help.Ansi ansi, IExceptionHandler exceptionHandler, String... args) {
+    public List<Object> parseWithHandlers(final IParseResultHandler handler, final PrintStream out, final Help.Ansi ansi, final IExceptionHandler exceptionHandler, final String... args) {
         try {
-            List<CommandLine> result = parse(args);
+            final List<CommandLine> result = parse(args);
             return handler.handleParseResult(result, out, ansi);
-        } catch (ParameterException ex) {
+        } catch (final ParameterException ex) {
             return exceptionHandler.handleException(ex, out, ansi, args);
         }
     }
@@ -666,7 +666,7 @@ public class CommandLine {
      * @param out the print stream to print the help message to
      * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation
      */
-    public static void usage(Object command, PrintStream out) {
+    public static void usage(final Object command, final PrintStream out) {
         toCommandLine(command).usage(out);
     }
 
@@ -678,7 +678,7 @@ public class CommandLine {
      * @param ansi whether the usage message should contain ANSI escape codes or not
      * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation
      */
-    public static void usage(Object command, PrintStream out, Help.Ansi ansi) {
+    public static void usage(final Object command, final PrintStream out, final Help.Ansi ansi) {
         toCommandLine(command).usage(out, ansi);
     }
 
@@ -690,7 +690,7 @@ public class CommandLine {
      * @param colorScheme the {@code ColorScheme} defining the styles for options, parameters and commands when ANSI is enabled
      * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation
      */
-    public static void usage(Object command, PrintStream out, Help.ColorScheme colorScheme) {
+    public static void usage(final Object command, final PrintStream out, final Help.ColorScheme colorScheme) {
         toCommandLine(command).usage(out, colorScheme);
     }
 
@@ -699,7 +699,7 @@ public class CommandLine {
      * @param out the printStream to print to
      * @see #usage(PrintStream, Help.ColorScheme)
      */
-    public void usage(PrintStream out) {
+    public void usage(final PrintStream out) {
         usage(out, Help.Ansi.AUTO);
     }
 
@@ -709,7 +709,7 @@ public class CommandLine {
      * @param ansi whether the usage message should include ANSI escape codes or not
      * @see #usage(PrintStream, Help.ColorScheme)
      */
-    public void usage(PrintStream out, Help.Ansi ansi) {
+    public void usage(final PrintStream out, final Help.Ansi ansi) {
         usage(out, Help.defaultColorScheme(ansi));
     }
     /**
@@ -744,8 +744,8 @@ public class CommandLine {
      * @param out the {@code PrintStream} to print the usage help message to
      * @param colorScheme the {@code ColorScheme} defining the styles for options, parameters and commands when ANSI is enabled
      */
-    public void usage(PrintStream out, Help.ColorScheme colorScheme) {
-        Help help = new Help(interpreter.command, colorScheme).addAllSubcommands(getSubcommands());
+    public void usage(final PrintStream out, final Help.ColorScheme colorScheme) {
+        final Help help = new Help(interpreter.command, colorScheme).addAllSubcommands(getSubcommands());
         if (!Help.DEFAULT_SEPARATOR.equals(getSeparator())) {
             help.separator = getSeparator();
             help.parameterLabelRenderer = help.createDefaultParamLabelRenderer(); // update for new separator
@@ -753,7 +753,7 @@ public class CommandLine {
         if (!Help.DEFAULT_COMMAND_NAME.equals(getCommandName())) {
             help.commandName = getCommandName();
         }
-        StringBuilder sb = new StringBuilder()
+        final StringBuilder sb = new StringBuilder()
                 .append(help.headerHeading())
                 .append(help.header())
                 .append(help.synopsisHeading())      //e.g. Usage:
@@ -777,7 +777,7 @@ public class CommandLine {
      * @see #printVersionHelp(PrintStream, Help.Ansi)
      * @since 0.9.8
      */
-    public void printVersionHelp(PrintStream out) { printVersionHelp(out, Help.Ansi.AUTO); }
+    public void printVersionHelp(final PrintStream out) { printVersionHelp(out, Help.Ansi.AUTO); }
 
     /**
      * Prints version information from the {@link Command#version()} annotation to the specified {@code PrintStream}.
@@ -790,8 +790,8 @@ public class CommandLine {
      * @see #isVersionHelpRequested()
      * @since 0.9.8
      */
-    public void printVersionHelp(PrintStream out, Help.Ansi ansi) {
-        for (String versionInfo : versionLines) {
+    public void printVersionHelp(final PrintStream out, final Help.Ansi ansi) {
+        for (final String versionInfo : versionLines) {
             out.println(ansi.new Text(versionInfo));
         }
     }
@@ -808,8 +808,8 @@ public class CommandLine {
      * @see #isVersionHelpRequested()
      * @since 1.0.0
      */
-    public void printVersionHelp(PrintStream out, Help.Ansi ansi, Object... params) {
-        for (String versionInfo : versionLines) {
+    public void printVersionHelp(final PrintStream out, final Help.Ansi ansi, final Object... params) {
+        for (final String versionInfo : versionLines) {
             out.println(ansi.new Text(String.format(versionInfo, params)));
         }
     }
@@ -832,7 +832,7 @@ public class CommandLine {
      * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)
      * @see RunFirst
      */
-    public static <C extends Callable<T>, T> T call(C callable, PrintStream out, String... args) {
+    public static <C extends Callable<T>, T> T call(final C callable, final PrintStream out, final String... args) {
         return call(callable, out, Help.Ansi.AUTO, args);
     }
     /**
@@ -880,9 +880,9 @@ public class CommandLine {
      * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)
      * @see RunLast
      */
-    public static <C extends Callable<T>, T> T call(C callable, PrintStream out, Help.Ansi ansi, String... args) {
-        CommandLine cmd = new CommandLine(callable); // validate command outside of try-catch
-        List<Object> results = cmd.parseWithHandlers(new RunLast(), out, ansi, new DefaultExceptionHandler(), args);
+    public static <C extends Callable<T>, T> T call(final C callable, final PrintStream out, final Help.Ansi ansi, final String... args) {
+        final CommandLine cmd = new CommandLine(callable); // validate command outside of try-catch
+        final List<Object> results = cmd.parseWithHandlers(new RunLast(), out, ansi, new DefaultExceptionHandler(), args);
         return results == null || results.isEmpty() ? null : (T) results.get(0);
     }
 
@@ -902,7 +902,7 @@ public class CommandLine {
      * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)
      * @see RunFirst
      */
-    public static <R extends Runnable> void run(R runnable, PrintStream out, String... args) {
+    public static <R extends Runnable> void run(final R runnable, final PrintStream out, final String... args) {
         run(runnable, out, Help.Ansi.AUTO, args);
     }
     /**
@@ -948,8 +948,8 @@ public class CommandLine {
      * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)
      * @see RunLast
      */
-    public static <R extends Runnable> void run(R runnable, PrintStream out, Help.Ansi ansi, String... args) {
-        CommandLine cmd = new CommandLine(runnable); // validate command outside of try-catch
+    public static <R extends Runnable> void run(final R runnable, final PrintStream out, final Help.Ansi ansi, final String... args) {
+        final CommandLine cmd = new CommandLine(runnable); // validate command outside of try-catch
         cmd.parseWithHandlers(new RunLast(), out, ansi, new DefaultExceptionHandler(), args);
     }
 
@@ -996,9 +996,9 @@ public class CommandLine {
      * @return this CommandLine object, to allow method chaining
      * @see #addSubcommand(String, Object)
      */
-    public <K> CommandLine registerConverter(Class<K> cls, ITypeConverter<K> converter) {
+    public <K> CommandLine registerConverter(final Class<K> cls, final ITypeConverter<K> converter) {
         interpreter.converterRegistry.put(Assert.notNull(cls, "class"), Assert.notNull(converter, "converter"));
-        for (CommandLine command : interpreter.commands.values()) {
+        for (final CommandLine command : interpreter.commands.values()) {
             command.registerConverter(cls, converter);
         }
         return this;
@@ -1014,7 +1014,7 @@ public class CommandLine {
      * The separator may also be set declaratively with the {@link CommandLine.Command#separator()} annotation attribute.
      * @param separator the String that separates option names from option values
      * @return this {@code CommandLine} object, to allow method chaining */
-    public CommandLine setSeparator(String separator) {
+    public CommandLine setSeparator(final String separator) {
         interpreter.separator = Assert.notNull(separator, "separator");
         return this;
     }
@@ -1030,35 +1030,35 @@ public class CommandLine {
      * The command name may also be set declaratively with the {@link CommandLine.Command#name()} annotation attribute.
      * @param commandName command name (also called program name) displayed in the usage help synopsis
      * @return this {@code CommandLine} object, to allow method chaining */
-    public CommandLine setCommandName(String commandName) {
+    public CommandLine setCommandName(final String commandName) {
         this.commandName = Assert.notNull(commandName, "commandName");
         return this;
     }
-    private static boolean empty(String str) { return str == null || str.trim().length() == 0; }
-    private static boolean empty(Object[] array) { return array == null || array.length == 0; }
-    private static boolean empty(Text txt) { return txt == null || txt.plain.toString().trim().length() == 0; }
-    private static String str(String[] arr, int i) { return (arr == null || arr.length == 0) ? "" : arr[i]; }
-    private static boolean isBoolean(Class<?> type) { return type == Boolean.class || type == Boolean.TYPE; }
-    private static CommandLine toCommandLine(Object obj) { return obj instanceof CommandLine ? (CommandLine) obj : new CommandLine(obj);}
-    private static boolean isMultiValue(Field field) {  return isMultiValue(field.getType()); }
-    private static boolean isMultiValue(Class<?> cls) { return cls.isArray() || Collection.class.isAssignableFrom(cls) || Map.class.isAssignableFrom(cls); }
-    private static Class<?>[] getTypeAttribute(Field field) {
-        Class<?>[] explicit = field.isAnnotationPresent(Parameters.class) ? field.getAnnotation(Parameters.class).type() : field.getAnnotation(Option.class).type();
+    private static boolean empty(final String str) { return str == null || str.trim().length() == 0; }
+    private static boolean empty(final Object[] array) { return array == null || array.length == 0; }
+    private static boolean empty(final Text txt) { return txt == null || txt.plain.toString().trim().length() == 0; }
+    private static String str(final String[] arr, final int i) { return (arr == null || arr.length == 0) ? "" : arr[i]; }
+    private static boolean isBoolean(final Class<?> type) { return type == Boolean.class || type == Boolean.TYPE; }
+    private static CommandLine toCommandLine(final Object obj) { return obj instanceof CommandLine ? (CommandLine) obj : new CommandLine(obj);}
+    private static boolean isMultiValue(final Field field) {  return isMultiValue(field.getType()); }
+    private static boolean isMultiValue(final Class<?> cls) { return cls.isArray() || Collection.class.isAssignableFrom(cls) || Map.class.isAssignableFrom(cls); }
+    private static Class<?>[] getTypeAttribute(final Field field) {
+        final Class<?>[] explicit = field.isAnnotationPresent(Parameters.class) ? field.getAnnotation(Parameters.class).type() : field.getAnnotation(Option.class).type();
         if (explicit.length > 0) { return explicit; }
         if (field.getType().isArray()) { return new Class<?>[] { field.getType().getComponentType() }; }
         if (isMultiValue(field)) {
-            Type type = field.getGenericType(); // e.g. Map<Long, ? extends Number>
+            final Type type = field.getGenericType(); // e.g. Map<Long, ? extends Number>
             if (type instanceof ParameterizedType) {
-                ParameterizedType parameterizedType = (ParameterizedType) type;
-                Type[] paramTypes = parameterizedType.getActualTypeArguments(); // e.g. ? extends Number
-                Class<?>[] result = new Class<?>[paramTypes.length];
+                final ParameterizedType parameterizedType = (ParameterizedType) type;
+                final Type[] paramTypes = parameterizedType.getActualTypeArguments(); // e.g. ? extends Number
+                final Class<?>[] result = new Class<?>[paramTypes.length];
                 for (int i = 0; i < paramTypes.length; i++) {
                     if (paramTypes[i] instanceof Class) { result[i] = (Class<?>) paramTypes[i]; continue; } // e.g. Long
                     if (paramTypes[i] instanceof WildcardType) { // e.g. ? extends Number
-                        WildcardType wildcardType = (WildcardType) paramTypes[i];
-                        Type[] lower = wildcardType.getLowerBounds(); // e.g. []
+                        final WildcardType wildcardType = (WildcardType) paramTypes[i];
+                        final Type[] lower = wildcardType.getLowerBounds(); // e.g. []
                         if (lower.length > 0 && lower[0] instanceof Class) { result[i] = (Class<?>) lower[0]; continue; }
-                        Type[] upper = wildcardType.getUpperBounds(); // e.g. Number
+                        final Type[] upper = wildcardType.getUpperBounds(); // e.g. Number
                         if (upper.length > 0 && upper[0] instanceof Class) { result[i] = (Class<?>) upper[0]; continue; }
                     }
                     Arrays.fill(result, String.class); return result; // too convoluted generic type, giving up
@@ -1656,7 +1656,7 @@ public class CommandLine {
          * @param unspecified {@code true} if no arity was specified on the option/parameter (value is based on type)
          * @param originalValue the original value that was specified on the option or parameter
          */
-        public Range(int min, int max, boolean variable, boolean unspecified, String originalValue) {
+        public Range(final int min, final int max, final boolean variable, final boolean unspecified, final String originalValue) {
             this.min = min;
             this.max = max;
             this.isVariable = variable;
@@ -1667,7 +1667,7 @@ public class CommandLine {
          * or the field type's default arity if no arity was specified.
          * @param field the field whose Option annotation to inspect
          * @return a new {@code Range} based on the Option arity annotation on the specified field */
-        public static Range optionArity(Field field) {
+        public static Range optionArity(final Field field) {
             return field.isAnnotationPresent(Option.class)
                     ? adjustForType(Range.valueOf(field.getAnnotation(Option.class).arity()), field)
                     : new Range(0, 0, false, true, "0");
@@ -1676,7 +1676,7 @@ public class CommandLine {
          * or the field type's default arity if no arity was specified.
          * @param field the field whose Parameters annotation to inspect
          * @return a new {@code Range} based on the Parameters arity annotation on the specified field */
-        public static Range parameterArity(Field field) {
+        public static Range parameterArity(final Field field) {
             return field.isAnnotationPresent(Parameters.class)
                     ? adjustForType(Range.valueOf(field.getAnnotation(Parameters.class).arity()), field)
                     : new Range(0, 0, false, true, "0");
@@ -1684,12 +1684,12 @@ public class CommandLine {
         /** Returns a new {@code Range} based on the {@link Parameters#index()} annotation on the specified field.
          * @param field the field whose Parameters annotation to inspect
          * @return a new {@code Range} based on the Parameters index annotation on the specified field */
-        public static Range parameterIndex(Field field) {
+        public static Range parameterIndex(final Field field) {
             return field.isAnnotationPresent(Parameters.class)
                     ? Range.valueOf(field.getAnnotation(Parameters.class).index())
                     : new Range(0, 0, false, true, "0");
         }
-        static Range adjustForType(Range result, Field field) {
+        static Range adjustForType(final Range result, final Field field) {
             return result.isUnspecified ? defaultArity(field) : result;
         }
         /** Returns the default arity {@code Range}: for {@link Option options} this is 0 for booleans and 1 for
@@ -1698,8 +1698,8 @@ public class CommandLine {
          * @param field the field whose default arity to return
          * @return a new {@code Range} indicating the default arity of the specified field
          * @since 2.0 */
-        public static Range defaultArity(Field field) {
-            Class<?> type = field.getType();
+        public static Range defaultArity(final Field field) {
+            final Class<?> type = field.getType();
             if (field.isAnnotationPresent(Option.class)) {
                 return defaultArity(type);
             }
@@ -1711,14 +1711,14 @@ public class CommandLine {
         /** Returns the default arity {@code Range} for {@link Option options}: booleans have arity 0, other types have arity 1.
          * @param type the type whose default arity to return
          * @return a new {@code Range} indicating the default arity of the specified type */
-        public static Range defaultArity(Class<?> type) {
+        public static Range defaultArity(final Class<?> type) {
             return isBoolean(type) ? Range.valueOf("0") : Range.valueOf("1");
         }
         private int size() { return 1 + max - min; }
-        static Range parameterCapacity(Field field) {
-            Range arity = parameterArity(field);
+        static Range parameterCapacity(final Field field) {
+            final Range arity = parameterArity(field);
             if (!isMultiValue(field)) { return arity; }
-            Range index = parameterIndex(field);
+            final Range index = parameterIndex(field);
             if (arity.max == 0)    { return arity; }
             if (index.size() == 1) { return arity; }
             if (index.isVariable)  { return Range.valueOf(arity.min + "..*"); }
@@ -1734,7 +1734,7 @@ public class CommandLine {
          * @return a new {@code Range} value */
         public static Range valueOf(String range) {
             range = range.trim();
-            boolean unspecified = range.length() == 0 || range.startsWith(".."); // || range.endsWith("..");
+            final boolean unspecified = range.length() == 0 || range.startsWith(".."); // || range.endsWith("..");
             int min = -1, max = -1;
             boolean variable = false;
             int dots = -1;
@@ -1747,13 +1747,13 @@ public class CommandLine {
                 variable = max == Integer.MAX_VALUE;
                 min = variable ? 0 : max;
             }
-            Range result = new Range(min, max, variable, unspecified, range);
+            final Range result = new Range(min, max, variable, unspecified, range);
             return result;
         }
-        private static int parseInt(String str, int defaultValue) {
+        private static int parseInt(final String str, final int defaultValue) {
             try {
                 return Integer.parseInt(str);
-            } catch (Exception ex) {
+            } catch (final Exception ex) {
                 return defaultValue;
             }
         }
@@ -1761,25 +1761,25 @@ public class CommandLine {
          * The {@code max} of the returned Range is guaranteed not to be less than the new {@code min} value.
          * @param newMin the {@code min} value of the returned Range object
          * @return a new Range object with the specified {@code min} value */
-        public Range min(int newMin) { return new Range(newMin, Math.max(newMin, max), isVariable, isUnspecified, originalValue); }
+        public Range min(final int newMin) { return new Range(newMin, Math.max(newMin, max), isVariable, isUnspecified, originalValue); }
 
         /** Returns a new Range object with the {@code max} value replaced by the specified value.
          * The {@code min} of the returned Range is guaranteed not to be greater than the new {@code max} value.
          * @param newMax the {@code max} value of the returned Range object
          * @return a new Range object with the specified {@code max} value */
-        public Range max(int newMax) { return new Range(Math.min(min, newMax), newMax, isVariable, isUnspecified, originalValue); }
+        public Range max(final int newMax) { return new Range(Math.min(min, newMax), newMax, isVariable, isUnspecified, originalValue); }
 
         /**
          * Returns {@code true} if this Range includes the specified value, {@code false} otherwise.
          * @param value the value to check
          * @return {@code true} if the specified value is not less than the minimum and not greater than the maximum of this Range
          */
-        public boolean contains(int value) { return min <= value && max >= value; }
+        public boolean contains(final int value) { return min <= value && max >= value; }
 
         @Override
-        public boolean equals(Object object) {
+        public boolean equals(final Object object) {
             if (!(object instanceof Range)) { return false; }
-            Range other = (Range) object;
+            final Range other = (Range) object;
             return other.max == this.max && other.min == this.min && other.isVariable == this.isVariable;
         }
         @Override
@@ -1791,32 +1791,32 @@ public class CommandLine {
             return min == max ? String.valueOf(min) : min + ".." + (isVariable ? "*" : max);
         }
         @Override
-        public int compareTo(Range other) {
-            int result = min - other.min;
+        public int compareTo(final Range other) {
+            final int result = min - other.min;
             return (result == 0) ? max - other.max : result;
         }
     }
-    static void init(Class<?> cls,
-                              List<Field> requiredFields,
-                              Map<String, Field> optionName2Field,
-                              Map<Character, Field> singleCharOption2Field,
-                              List<Field> positionalParametersFields) {
-        Field[] declaredFields = cls.getDeclaredFields();
-        for (Field field : declaredFields) {
+    static void init(final Class<?> cls,
+                              final List<Field> requiredFields,
+                              final Map<String, Field> optionName2Field,
+                              final Map<Character, Field> singleCharOption2Field,
+                              final List<Field> positionalParametersFields) {
+        final Field[] declaredFields = cls.getDeclaredFields();
+        for (final Field field : declaredFields) {
             field.setAccessible(true);
             if (field.isAnnotationPresent(Option.class)) {
-                Option option = field.getAnnotation(Option.class);
+                final Option option = field.getAnnotation(Option.class);
                 if (option.required()) {
                     requiredFields.add(field);
                 }
-                for (String name : option.names()) { // cannot be null or empty
-                    Field existing = optionName2Field.put(name, field);
+                for (final String name : option.names()) { // cannot be null or empty
+                    final Field existing = optionName2Field.put(name, field);
                     if (existing != null && existing != field) {
                         throw DuplicateOptionAnnotationsException.create(name, field, existing);
                     }
                     if (name.length() == 2 && name.startsWith("-")) {
-                        char flag = name.charAt(1);
-                        Field existing2 = singleCharOption2Field.put(flag, field);
+                        final char flag = name.charAt(1);
+                        final Field existing2 = singleCharOption2Field.put(flag, field);
                         if (existing2 != null && existing2 != field) {
                             throw DuplicateOptionAnnotationsException.create(name, field, existing2);
                         }
@@ -1829,17 +1829,17 @@ public class CommandLine {
                             + field.getName() + "' is both.");
                 }
                 positionalParametersFields.add(field);
-                Range arity = Range.parameterArity(field);
+                final Range arity = Range.parameterArity(field);
                 if (arity.min > 0) {
                     requiredFields.add(field);
                 }
             }
         }
     }
-    static void validatePositionalParameters(List<Field> positionalParametersFields) {
+    static void validatePositionalParameters(final List<Field> positionalParametersFields) {
         int min = 0;
-        for (Field field : positionalParametersFields) {
-            Range index = Range.parameterIndex(field);
+        for (final Field field : positionalParametersFields) {
+            final Range index = Range.parameterIndex(field);
             if (index.min > min) {
                 throw new ParameterIndexGapException("Missing field annotated with @Parameter(index=" + min +
                         "). Nearest field '" + field.getName() + "' has index=" + index.min);
@@ -1848,7 +1848,7 @@ public class CommandLine {
             min = min == Integer.MAX_VALUE ? min : min + 1;
         }
     }
-    private static <T> Stack<T> reverse(Stack<T> stack) {
+    private static <T> Stack<T> reverse(final Stack<T> stack) {
         Collections.reverse(stack);
         return stack;
     }
@@ -1867,7 +1867,7 @@ public class CommandLine {
         private String separator = Help.DEFAULT_SEPARATOR;
         private int position;
 
-        Interpreter(Object command) {
+        Interpreter(final Object command) {
             converterRegistry.put(Path.class,          new BuiltIn.PathConverter());
             converterRegistry.put(Object.class,        new BuiltIn.StringConverter());
             converterRegistry.put(String.class,        new BuiltIn.StringConverter());
@@ -1910,28 +1910,28 @@ public class CommandLine {
                 init(cls, requiredFields, optionName2Field, singleCharOption2Field, positionalParametersFields);
                 if (cls.isAnnotationPresent(Command.class)) {
                     hasCommandAnnotation = true;
-                    Command cmd = cls.getAnnotation(Command.class);
+                    final Command cmd = cls.getAnnotation(Command.class);
                     declaredSeparator = (declaredSeparator == null) ? cmd.separator() : declaredSeparator;
                     declaredName = (declaredName == null) ? cmd.name() : declaredName;
                     CommandLine.this.versionLines.addAll(Arrays.asList(cmd.version()));
 
-                    for (Class<?> sub : cmd.subcommands()) {
-                        Command subCommand = sub.getAnnotation(Command.class);
+                    for (final Class<?> sub : cmd.subcommands()) {
+                        final Command subCommand = sub.getAnnotation(Command.class);
                         if (subCommand == null || Help.DEFAULT_COMMAND_NAME.equals(subCommand.name())) {
                             throw new InitializationException("Subcommand " + sub.getName() +
                                     " is missing the mandatory @Command annotation with a 'name' attribute");
                         }
                         try {
-                            Constructor<?> constructor = sub.getDeclaredConstructor();
+                            final Constructor<?> constructor = sub.getDeclaredConstructor();
                             constructor.setAccessible(true);
-                            CommandLine commandLine = toCommandLine(constructor.newInstance());
+                            final CommandLine commandLine = toCommandLine(constructor.newInstance());
                             commandLine.parent = CommandLine.this;
                             commands.put(subCommand.name(), commandLine);
                         }
-                        catch (InitializationException ex) { throw ex; }
-                        catch (NoSuchMethodException ex) { throw new InitializationException("Cannot instantiate subcommand " +
+                        catch (final InitializationException ex) { throw ex; }
+                        catch (final NoSuchMethodException ex) { throw new InitializationException("Cannot instantiate subcommand " +
                                 sub.getName() + ": the class has no constructor", ex); }
-                        catch (Exception ex) {
+                        catch (final Exception ex) {
                             throw new InitializationException("Could not instantiate and add subcommand " +
                                     sub.getName() + ": " + ex, ex);
                         }
@@ -1956,41 +1956,41 @@ public class CommandLine {
          * @return a list with all commands and subcommands initialized by this method
          * @throws ParameterException if the specified command line arguments are invalid
          */
-        List<CommandLine> parse(String... args) {
+        List<CommandLine> parse(final String... args) {
             Assert.notNull(args, "argument array");
             if (tracer.isInfo()) {tracer.info("Parsing %d command line args %s%n", args.length, Arrays.toString(args));}
-            Stack<String> arguments = new Stack<String>();
+            final Stack<String> arguments = new Stack<String>();
             for (int i = args.length - 1; i >= 0; i--) {
                 arguments.push(args[i]);
             }
-            List<CommandLine> result = new ArrayList<CommandLine>();
+            final List<CommandLine> result = new ArrayList<CommandLine>();
             parse(result, arguments, args);
             return result;
         }
 
-        private void parse(List<CommandLine> parsedCommands, Stack<String> argumentStack, String[] originalArgs) {
+        private void parse(final List<CommandLine> parsedCommands, final Stack<String> argumentStack, final String[] originalArgs) {
             // first reset any state in case this CommandLine instance is being reused
             isHelpRequested = false;
             CommandLine.this.versionHelpRequested = false;
             CommandLine.this.usageHelpRequested = false;
 
-            Class<?> cmdClass = this.command.getClass();
+            final Class<?> cmdClass = this.command.getClass();
             if (tracer.isDebug()) {tracer.debug("Initializing %s: %d options, %d positional parameters, %d required, %d subcommands.%n", cmdClass.getName(), new HashSet<Field>(optionName2Field.values()).size(), positionalParametersFields.size(), requiredFields.size(), commands.size());}
             parsedCommands.add(CommandLine.this);
-            List<Field> required = new ArrayList<Field>(requiredFields);
-            Set<Field> initialized = new HashSet<Field>();
+            final List<Field> required = new ArrayList<Field>(requiredFields);
+            final Set<Field> initialized = new HashSet<Field>();
             Collections.sort(required, new PositionalParametersSorter());
             try {
                 processArguments(parsedCommands, argumentStack, required, initialized, originalArgs);
-            } catch (ParameterException ex) {
+            } catch (final ParameterException ex) {
                 throw ex;
-            } catch (Exception ex) {
-                int offendingArgIndex = originalArgs.length - argumentStack.size() - 1;
-                String arg = offendingArgIndex >= 0 && offendingArgIndex < originalArgs.length ? originalArgs[offendingArgIndex] : "?";
+            } catch (final Exception ex) {
+                final int offendingArgIndex = originalArgs.length - argumentStack.size() - 1;
+                final String arg = offendingArgIndex >= 0 && offendingArgIndex < originalArgs.length ? originalArgs[offendingArgIndex] : "?";
                 throw ParameterException.create(CommandLine.this, ex, arg, offendingArgIndex, originalArgs);
             }
             if (!isAnyHelpRequested() && !required.isEmpty()) {
-                for (Field missing : required) {
+                for (final Field missing : required) {
                     if (missing.isAnnotationPresent(Option.class)) {
                         throw MissingParameterException.create(CommandLine.this, required, separator);
                     } else {
@@ -2004,11 +2004,11 @@ public class CommandLine {
             }
         }
 
-        private void processArguments(List<CommandLine> parsedCommands,
-                                      Stack<String> args,
-                                      Collection<Field> required,
-                                      Set<Field> initialized,
-                                      String[] originalArgs) throws Exception {
+        private void processArguments(final List<CommandLine> parsedCommands,
+                                      final Stack<String> args,
+                                      final Collection<Field> required,
+                                      final Set<Field> initialized,
+                                      final String[] originalArgs) throws Exception {
             // arg must be one of:
             // 1. the "--" double dash separating options from positional arguments
             // 1. a stand-alone flag, like "-v" or "--verbose": no value required, must map to boolean or Boolean field
@@ -2045,13 +2045,13 @@ public class CommandLine {
                 // or an option may have one or more option parameters.
                 // A parameter may be attached to the option.
                 boolean paramAttachedToOption = false;
-                int separatorIndex = arg.indexOf(separator);
+                final int separatorIndex = arg.indexOf(separator);
                 if (separatorIndex > 0) {
-                    String key = arg.substring(0, separatorIndex);
+                    final String key = arg.substring(0, separatorIndex);
                     // be greedy. Consume the whole arg as an option if possible.
                     if (optionName2Field.containsKey(key) && !optionName2Field.containsKey(arg)) {
                         paramAttachedToOption = true;
-                        String optionParam = arg.substring(separatorIndex + separator.length());
+                        final String optionParam = arg.substring(separatorIndex + separator.length());
                         args.push(optionParam);
                         arg = key;
                         if (tracer.isDebug()) {tracer.debug("Separated '%s' option from '%s' option parameter%n", key, optionParam);}
@@ -2081,43 +2081,44 @@ public class CommandLine {
                 }
             }
         }
-        private boolean resemblesOption(String arg) {
+        private boolean resemblesOption(final String arg) {
             int count = 0;
-            for (String optionName : optionName2Field.keySet()) {
+            for (final String optionName : optionName2Field.keySet()) {
                 for (int i = 0; i < arg.length(); i++) {
                     if (optionName.length() > i && arg.charAt(i) == optionName.charAt(i)) { count++; } else { break; }
                 }
             }
-            boolean result = count > 0 && count * 10 >= optionName2Field.size() * 9; // at least one prefix char in common with 9 out of 10 options
+            final boolean result = count > 0 && count * 10 >= optionName2Field.size() * 9; // at least one prefix char in common with 9 out of 10 options
             if (tracer.isDebug()) {tracer.debug("%s %s an option: %d matching prefix chars out of %d option names%n", arg, (result ? "resembles" : "doesn't resemble"), count, optionName2Field.size());}
             return result;
         }
-        private void handleUnmatchedArguments(String arg) {Stack<String> args = new Stack<String>(); args.add(arg); handleUnmatchedArguments(args);}
-        private void handleUnmatchedArguments(Stack<String> args) {
+        private void handleUnmatchedArguments(final String arg) {final Stack<String> args = new Stack<String>(); args.add(arg); handleUnmatchedArguments(args);}
+        private void handleUnmatchedArguments(final Stack<String> args) {
             while (!args.isEmpty()) { unmatchedArguments.add(args.pop()); } // addAll would give args in reverse order
         }
 
-        private void processRemainderAsPositionalParameters(Collection<Field> required, Set<Field> initialized, Stack<String> args) throws Exception {
+        private void processRemainderAsPositionalParameters(final Collection<Field> required, final Set<Field> initialized, final Stack<String> args) throws Exception {
             while (!args.empty()) {
                 processPositionalParameter(required, initialized, args);
             }
         }
-        private void processPositionalParameter(Collection<Field> required, Set<Field> initialized, Stack<String> args) throws Exception {
+        private void processPositionalParameter(final Collection<Field> required, final Set<Field> initialized, final Stack<String> args) throws Exception {
             if (tracer.isDebug()) {tracer.debug("Processing next arg as a positional parameter at index=%d. Remainder=%s%n", position, reverse((Stack<String>) args.clone()));}
             int consumed = 0;
-            for (Field positionalParam : positionalParametersFields) {
-                Range indexRange = Range.parameterIndex(positionalParam);
+            for (final Field positionalParam : positionalParametersFields) {
+                final Range indexRange = Range.parameterIndex(positionalParam);
                 if (!indexRange.contains(position)) {
                     continue;
                 }
                 @SuppressWarnings("unchecked")
+                final
                 Stack<String> argsCopy = (Stack<String>) args.clone();
-                Range arity = Range.parameterArity(positionalParam);
+                final Range arity = Range.parameterArity(positionalParam);
                 if (tracer.isDebug()) {tracer.debug("Position %d is in index range %s. Trying to assign args to %s, arity=%s%n", position, indexRange, positionalParam, arity);}
                 assertNoMissingParameters(positionalParam, arity.min, argsCopy);
-                int originalSize = argsCopy.size();
+                final int originalSize = argsCopy.size();
                 applyOption(positionalParam, Parameters.class, arity, false, argsCopy, initialized, "args[" + indexRange + "] at position " + position);
-                int count = originalSize - argsCopy.size();
+                final int count = originalSize - argsCopy.size();
                 if (count > 0) { required.remove(positionalParam); }
                 consumed = Math.max(consumed, count);
             }
@@ -2130,12 +2131,12 @@ public class CommandLine {
             }
         }
 
-        private void processStandaloneOption(Collection<Field> required,
-                                             Set<Field> initialized,
-                                             String arg,
-                                             Stack<String> args,
-                                             boolean paramAttachedToKey) throws Exception {
-            Field field = optionName2Field.get(arg);
+        private void processStandaloneOption(final Collection<Field> required,
+                                             final Set<Field> initialized,
+                                             final String arg,
+                                             final Stack<String> args,
+                                             final boolean paramAttachedToKey) throws Exception {
+            final Field field = optionName2Field.get(arg);
             required.remove(field);
             Range arity = Range.optionArity(field);
             if (paramAttachedToKey) {
@@ -2145,19 +2146,19 @@ public class CommandLine {
             applyOption(field, Option.class, arity, paramAttachedToKey, args, initialized, "option " + arg);
         }
 
-        private void processClusteredShortOptions(Collection<Field> required,
-                                                  Set<Field> initialized,
-                                                  String arg,
-                                                  Stack<String> args)
+        private void processClusteredShortOptions(final Collection<Field> required,
+                                                  final Set<Field> initialized,
+                                                  final String arg,
+                                                  final Stack<String> args)
                 throws Exception {
-            String prefix = arg.substring(0, 1);
+            final String prefix = arg.substring(0, 1);
             String cluster = arg.substring(1);
             boolean paramAttachedToOption = true;
             do {
                 if (cluster.length() > 0 && singleCharOption2Field.containsKey(cluster.charAt(0))) {
-                    Field field = singleCharOption2Field.get(cluster.charAt(0));
+                    final Field field = singleCharOption2Field.get(cluster.charAt(0));
                     Range arity = Range.optionArity(field);
-                    String argDescription = "option " + prefix + cluster.charAt(0);
+                    final String argDescription = "option " + prefix + cluster.charAt(0);
                     if (tracer.isDebug()) {tracer.debug("Found option '%s%s' in %s: field %s, arity=%s%n", prefix, cluster.charAt(0), arg, field, arity);}
                     required.remove(field);
                     cluster = cluster.length() > 0 ? cluster.substring(1) : "";
@@ -2175,7 +2176,7 @@ public class CommandLine {
                     if (!empty(cluster)) {
                         args.push(cluster); // interpret remainder as option parameter
                     }
-                    int consumed = applyOption(field, Option.class, arity, paramAttachedToOption, args, initialized, argDescription);
+                    final int consumed = applyOption(field, Option.class, arity, paramAttachedToOption, args, initialized, argDescription);
                     // only return if cluster (and maybe more) was consumed, otherwise continue do-while loop
                     if (empty(cluster) || consumed > 0 || args.isEmpty()) {
                         return;
@@ -2208,15 +2209,15 @@ public class CommandLine {
             } while (true);
         }
 
-        private int applyOption(Field field,
-                                Class<?> annotation,
-                                Range arity,
-                                boolean valueAttachedToOption,
-                                Stack<String> args,
-                                Set<Field> initialized,
-                                String argDescription) throws Exception {
+        private int applyOption(final Field field,
+                                final Class<?> annotation,
+                                final Range arity,
+                                final boolean valueAttachedToOption,
+                                final Stack<String> args,
+                                final Set<Field> initialized,
+                                final String argDescription) throws Exception {
             updateHelpRequested(field);
-            int length = args.size();
+            final int length = args.size();
             assertNoMissingParameters(field, arity.min, args);
 
             Class<?> cls = field.getType();
@@ -2233,13 +2234,13 @@ public class CommandLine {
             return applyValueToSingleValuedField(field, arity, args, cls, initialized, argDescription);
         }
 
-        private int applyValueToSingleValuedField(Field field,
-                                                  Range arity,
-                                                  Stack<String> args,
-                                                  Class<?> cls,
-                                                  Set<Field> initialized,
-                                                  String argDescription) throws Exception {
-            boolean noMoreValues = args.isEmpty();
+        private int applyValueToSingleValuedField(final Field field,
+                                                  final Range arity,
+                                                  final Stack<String> args,
+                                                  final Class<?> cls,
+                                                  final Set<Field> initialized,
+                                                  final String argDescription) throws Exception {
+            final boolean noMoreValues = args.isEmpty();
             String value = args.isEmpty() ? null : trim(args.pop()); // unquote the value
             int result = arity.min; // the number or args we need to consume
 
@@ -2253,16 +2254,16 @@ public class CommandLine {
                     if (value != null) {
                         args.push(value); // we don't consume the value
                     }
-                    Boolean currentValue = (Boolean) field.get(command);
+                    final Boolean currentValue = (Boolean) field.get(command);
                     value = String.valueOf(currentValue == null ? true : !currentValue); // #147 toggle existing boolean value
                 }
             }
             if (noMoreValues && value == null) {
                 return 0;
             }
-            ITypeConverter<?> converter = getTypeConverter(cls, field);
-            Object newValue = tryConvert(field, -1, converter, value, cls);
-            Object oldValue = field.get(command);
+            final ITypeConverter<?> converter = getTypeConverter(cls, field);
+            final Object newValue = tryConvert(field, -1, converter, value, cls);
+            final Object oldValue = field.get(command);
             TraceLevel level = TraceLevel.INFO;
             String traceMessage = "Setting %s field '%s.%s' to '%5$s' (was '%4$s') for %6$s%n";
             if (initialized != null) {
@@ -2281,34 +2282,34 @@ public class CommandLine {
             field.set(command, newValue);
             return result;
         }
-        private int applyValuesToMapField(Field field,
-                                          Class<?> annotation,
-                                          Range arity,
-                                          Stack<String> args,
-                                          Class<?> cls,
-                                          String argDescription) throws Exception {
-            Class<?>[] classes = getTypeAttribute(field);
+        private int applyValuesToMapField(final Field field,
+                                          final Class<?> annotation,
+                                          final Range arity,
+                                          final Stack<String> args,
+                                          final Class<?> cls,
+                                          final String argDescription) throws Exception {
+            final Class<?>[] classes = getTypeAttribute(field);
             if (classes.length < 2) { throw new ParameterException(CommandLine.this, "Field " + field + " needs two types (one for the map key, one for the value) but only has " + classes.length + " types configured."); }
-            ITypeConverter<?> keyConverter   = getTypeConverter(classes[0], field);
-            ITypeConverter<?> valueConverter = getTypeConverter(classes[1], field);
+            final ITypeConverter<?> keyConverter   = getTypeConverter(classes[0], field);
+            final ITypeConverter<?> valueConverter = getTypeConverter(classes[1], field);
             Map<Object, Object> result = (Map<Object, Object>) field.get(command);
             if (result == null) {
                 result = createMap(cls);
                 field.set(command, result);
             }
-            int originalSize = result.size();
+            final int originalSize = result.size();
             consumeMapArguments(field, arity, args, classes, keyConverter, valueConverter, result, argDescription);
             return result.size() - originalSize;
         }
 
-        private void consumeMapArguments(Field field,
-                                         Range arity,
-                                         Stack<String> args,
-                                         Class<?>[] classes,
-                                         ITypeConverter<?> keyConverter,
-                                         ITypeConverter<?> valueConverter,
-                                         Map<Object, Object> result,
-                                         String argDescription) throws Exception {
+        private void consumeMapArguments(final Field field,
+                                         final Range arity,
+                                         final Stack<String> args,
+                                         final Class<?>[] classes,
+                                         final ITypeConverter<?> keyConverter,
+                                         final ITypeConverter<?> valueConverter,
+                                         final Map<Object, Object> result,
+                                         final String argDescription) throws Exception {
             // first do the arity.min mandatory parameters
             for (int i = 0; i < arity.min; i++) {
                 consumeOneMapArgument(field, arity, args, classes, keyConverter, valueConverter, result, i, argDescription);
@@ -2324,19 +2325,19 @@ public class CommandLine {
             }
         }
 
-        private void consumeOneMapArgument(Field field,
-                                           Range arity,
-                                           Stack<String> args,
-                                           Class<?>[] classes,
-                                           ITypeConverter<?> keyConverter, ITypeConverter<?> valueConverter,
-                                           Map<Object, Object> result,
-                                           int index,
-                                           String argDescription) throws Exception {
-            String[] values = split(trim(args.pop()), field);
-            for (String value : values) {
-                String[] keyValue = value.split("=");
+        private void consumeOneMapArgument(final Field field,
+                                           final Range arity,
+                                           final Stack<String> args,
+                                           final Class<?>[] classes,
+                                           final ITypeConverter<?> keyConverter, final ITypeConverter<?> valueConverter,
+                                           final Map<Object, Object> result,
+                                           final int index,
+                                           final String argDescription) throws Exception {
+            final String[] values = split(trim(args.pop()), field);
+            for (final String value : values) {
+                final String[] keyValue = value.split("=");
                 if (keyValue.length < 2) {
-                    String splitRegex = splitRegex(field);
+                    final String splitRegex = splitRegex(field);
                     if (splitRegex.length() == 0) {
                         throw new ParameterException(CommandLine.this, "Value for option " + optionDescription("", field,
                                 0) + " should be in KEY=VALUE format but was " + value);
@@ -2345,44 +2346,44 @@ public class CommandLine {
                                 0) + " should be in KEY=VALUE[" + splitRegex + "KEY=VALUE]... format but was " + value);
                     }
                 }
-                Object mapKey =   tryConvert(field, index, keyConverter,   keyValue[0], classes[0]);
-                Object mapValue = tryConvert(field, index, valueConverter, keyValue[1], classes[1]);
+                final Object mapKey =   tryConvert(field, index, keyConverter,   keyValue[0], classes[0]);
+                final Object mapValue = tryConvert(field, index, valueConverter, keyValue[1], classes[1]);
                 result.put(mapKey, mapValue);
                 if (tracer.isInfo()) {tracer.info("Putting [%s : %s] in %s<%s, %s> field '%s.%s' for %s%n", String.valueOf(mapKey), String.valueOf(mapValue),
                         result.getClass().getSimpleName(), classes[0].getSimpleName(), classes[1].getSimpleName(), field.getDeclaringClass().getSimpleName(), field.getName(), argDescription);}
             }
         }
 
-        private void checkMaxArityExceeded(Range arity, int remainder, Field field, String[] values) {
+        private void checkMaxArityExceeded(final Range arity, final int remainder, final Field field, final String[] values) {
             if (values.length <= remainder) { return; }
-            String desc = arity.max == remainder ? "" + remainder : arity + ", remainder=" + remainder;
+            final String desc = arity.max == remainder ? "" + remainder : arity + ", remainder=" + remainder;
             throw new MaxValuesforFieldExceededException(CommandLine.this, optionDescription("", field, -1) +
                     " max number of values (" + arity.max + ") exceeded: remainder is " + remainder + " but " +
                     values.length + " values were specified: " + Arrays.toString(values));
         }
 
-        private int applyValuesToArrayField(Field field,
-                                            Class<?> annotation,
-                                            Range arity,
-                                            Stack<String> args,
-                                            Class<?> cls,
-                                            String argDescription) throws Exception {
-            Object existing = field.get(command);
-            int length = existing == null ? 0 : Array.getLength(existing);
-            Class<?> type = getTypeAttribute(field)[0];
-            List<Object> converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);
-            List<Object> newValues = new ArrayList<Object>();
+        private int applyValuesToArrayField(final Field field,
+                                            final Class<?> annotation,
+                                            final Range arity,
+                                            final Stack<String> args,
+                                            final Class<?> cls,
+                                            final String argDescription) throws Exception {
+            final Object existing = field.get(command);
+            final int length = existing == null ? 0 : Array.getLength(existing);
+            final Class<?> type = getTypeAttribute(field)[0];
+            final List<Object> converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);
+            final List<Object> newValues = new ArrayList<Object>();
             for (int i = 0; i < length; i++) {
                 newValues.add(Array.get(existing, i));
             }
-            for (Object obj : converted) {
+            for (final Object obj : converted) {
                 if (obj instanceof Collection<?>) {
                     newValues.addAll((Collection<?>) obj);
                 } else {
                     newValues.add(obj);
                 }
             }
-            Object array = Array.newInstance(type, newValues.size());
+            final Object array = Array.newInstance(type, newValues.size());
             field.set(command, array);
             for (int i = 0; i < newValues.size(); i++) {
                 Array.set(array, i, newValues.get(i));
@@ -2391,21 +2392,21 @@ public class CommandLine {
         }
 
         @SuppressWarnings("unchecked")
-        private int applyValuesToCollectionField(Field field,
-                                                 Class<?> annotation,
-                                                 Range arity,
-                                                 Stack<String> args,
-                                                 Class<?> cls,
-                                                 String argDescription) throws Exception {
+        private int applyValuesToCollectionField(final Field field,
+                                                 final Class<?> annotation,
+                                                 final Range arity,
+                                                 final Stack<String> args,
+                                                 final Class<?> cls,
+                                                 final String argDescription) throws Exception {
             Collection<Object> collection = (Collection<Object>) field.get(command);
-            Class<?> type = getTypeAttribute(field)[0];
-            int length = collection == null ? 0 : collection.size();
-            List<Object> converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);
+            final Class<?> type = getTypeAttribute(field)[0];
+            final int length = collection == null ? 0 : collection.size();
+            final List<Object> converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);
             if (collection == null) {
                 collection = createCollection(cls);
                 field.set(command, collection);
             }
-            for (Object element : converted) {
+            for (final Object element : converted) {
                 if (element instanceof Collection<?>) {
                     collection.addAll((Collection<?>) element);
                 } else {
@@ -2415,14 +2416,14 @@ public class CommandLine {
             return converted.size();
         }
 
-        private List<Object> consumeArguments(Field field,
-                                              Class<?> annotation,
-                                              Range arity,
-                                              Stack<String> args,
-                                              Class<?> type,
-                                              int originalSize,
-                                              String argDescription) throws Exception {
-            List<Object> result = new ArrayList<Object>();
+        private List<Object> consumeArguments(final Field field,
+                                              final Class<?> annotation,
+                                              final Range arity,
+                                              final Stack<String> args,
+                                              final Class<?> type,
+                                              final int originalSize,
+                                              final String argDescription) throws Exception {
+            final List<Object> result = new ArrayList<Object>();
 
             // first do the arity.min mandatory parameters
             for (int i = 0; i < arity.min; i++) {
@@ -2440,16 +2441,16 @@ public class CommandLine {
             return result;
         }
 
-        private int consumeOneArgument(Field field,
-                                       Range arity,
-                                       Stack<String> args,
-                                       Class<?> type,
-                                       List<Object> result,
+        private int consumeOneArgument(final Field field,
+                                       final Range arity,
+                                       final Stack<String> args,
+                                       final Class<?> type,
+                                       final List<Object> result,
                                        int index,
-                                       int originalSize,
-                                       String argDescription) throws Exception {
-            String[] values = split(trim(args.pop()), field);
-            ITypeConverter<?> converter = getTypeConverter(type, field);
+                                       final int originalSize,
+                                       final String argDescription) throws Exception {
+            final String[] values = split(trim(args.pop()), field);
+            final ITypeConverter<?> converter = getTypeConverter(type, field);
 
             for (int j = 0; j < values.length; j++) {
                 result.add(tryConvert(field, index, converter, values[j], type));
@@ -2465,13 +2466,13 @@ public class CommandLine {
             return ++index;
         }
 
-        private String splitRegex(Field field) {
+        private String splitRegex(final Field field) {
             if (field.isAnnotationPresent(Option.class))     { return field.getAnnotation(Option.class).split(); }
             if (field.isAnnotationPresent(Parameters.class)) { return field.getAnnotation(Parameters.class).split(); }
             return "";
         }
-        private String[] split(String value, Field field) {
-            String regex = splitRegex(field);
+        private String[] split(final String value, final Field field) {
+            final String regex = splitRegex(field);
             return regex.length() == 0 ? new String[] {value} : value.split(regex);
         }
 
@@ -2481,7 +2482,7 @@ public class CommandLine {
          * @param arg the string to determine whether it is an option or not
          * @return true if it is an option, false otherwise
          */
-        private boolean isOption(String arg) {
+        private boolean isOption(final String arg) {
             if ("--".equals(arg)) {
                 return true;
             }
@@ -2489,7 +2490,7 @@ public class CommandLine {
             if (optionName2Field.containsKey(arg)) { // -v or -f or --file (not attached to param or other option)
                 return true;
             }
-            int separatorIndex = arg.indexOf(separator);
+            final int separatorIndex = arg.indexOf(separator);
             if (separatorIndex > 0) { // -f=FILE or --file==FILE (attached to param via separator)
                 if (optionName2Field.containsKey(arg.substring(0, separatorIndex))) {
                     return true;
@@ -2497,33 +2498,33 @@ public class CommandLine {
             }
             return (arg.length() > 2 && arg.startsWith("-") && singleCharOption2Field.containsKey(arg.charAt(1)));
         }
-        private Object tryConvert(Field field, int index, ITypeConverter<?> converter, String value, Class<?> type)
+        private Object tryConvert(final Field field, final int index, final ITypeConverter<?> converter, final String value, final Class<?> type)
                 throws Exception {
             try {
                 return converter.convert(value);
-            } catch (TypeConversionException ex) {
+            } catch (final TypeConversionException ex) {
                 throw new ParameterException(CommandLine.this, ex.getMessage() + optionDescription(" for ", field, index));
-            } catch (Exception other) {
-                String desc = optionDescription(" for ", field, index) + ": " + other;
+            } catch (final Exception other) {
+                final String desc = optionDescription(" for ", field, index) + ": " + other;
                 throw new ParameterException(CommandLine.this, "Could not convert '" + value + "' to " + type.getSimpleName() + desc, other);
             }
         }
 
-        private String optionDescription(String prefix, Field field, int index) {
-            Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();
+        private String optionDescription(final String prefix, final Field field, final int index) {
+            final Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();
             String desc = "";
             if (field.isAnnotationPresent(Option.class)) {
                 desc = prefix + "option '" + field.getAnnotation(Option.class).names()[0] + "'";
                 if (index >= 0) {
-                    Range arity = Range.optionArity(field);
+                    final Range arity = Range.optionArity(field);
                     if (arity.max > 1) {
                         desc += " at index " + index;
                     }
                     desc += " (" + labelRenderer.renderParameterLabel(field, Help.Ansi.OFF, Collections.<IStyle>emptyList()) + ")";
                 }
             } else if (field.isAnnotationPresent(Parameters.class)) {
-                Range indexRange = Range.parameterIndex(field);
-                Text label = labelRenderer.renderParameterLabel(field, Help.Ansi.OFF, Collections.<IStyle>emptyList());
+                final Range indexRange = Range.parameterIndex(field);
+                final Text label = labelRenderer.renderParameterLabel(field, Help.Ansi.OFF, Collections.<IStyle>emptyList());
                 desc = prefix + "positional parameter at index " + indexRange + " (" + label + ")";
             }
             return desc;
@@ -2531,19 +2532,19 @@ public class CommandLine {
 
         private boolean isAnyHelpRequested() { return isHelpRequested || versionHelpRequested || usageHelpRequested; }
 
-        private void updateHelpRequested(Field field) {
+        private void updateHelpRequested(final Field field) {
             if (field.isAnnotationPresent(Option.class)) {
                 isHelpRequested                       |= is(field, "help", field.getAnnotation(Option.class).help());
                 CommandLine.this.versionHelpRequested |= is(field, "versionHelp", field.getAnnotation(Option.class).versionHelp());
                 CommandLine.this.usageHelpRequested   |= is(field, "usageHelp", field.getAnnotation(Option.class).usageHelp());
             }
         }
-        private boolean is(Field f, String description, boolean value) {
+        private boolean is(final Field f, final String description, final boolean value) {
             if (value) { if (tracer.isInfo()) {tracer.info("Field '%s.%s' has '%s' annotation: not validating required fields%n", f.getDeclaringClass().getSimpleName(), f.getName(), description); }}
             return value;
         }
         @SuppressWarnings("unchecked")
-        private Collection<Object> createCollection(Class<?> collectionClass) throws Exception {
+        private Collection<Object> createCollection(final Class<?> collectionClass) throws Exception {
             if (collectionClass.isInterface()) {
                 if (List.class.isAssignableFrom(collectionClass)) {
                     return new ArrayList<Object>();
@@ -2559,14 +2560,14 @@ public class CommandLine {
             // custom Collection implementation class must have default constructor
             return (Collection<Object>) collectionClass.newInstance();
         }
-        private Map<Object, Object> createMap(Class<?> mapClass) throws Exception {
+        private Map<Object, Object> createMap(final Class<?> mapClass) throws Exception {
             try { // if it is an implementation class, instantiate it
                 return (Map<Object, Object>) mapClass.newInstance();
-            } catch (Exception ignored) {}
+            } catch (final Exception ignored) {}
             return new LinkedHashMap<Object, Object>();
         }
-        private ITypeConverter<?> getTypeConverter(final Class<?> type, Field field) {
-            ITypeConverter<?> result = converterRegistry.get(type);
+        private ITypeConverter<?> getTypeConverter(final Class<?> type, final Field field) {
+            final ITypeConverter<?> result = converterRegistry.get(type);
             if (result != null) {
                 return result;
             }
@@ -2574,7 +2575,7 @@ public class CommandLine {
                 return new ITypeConverter<Object>() {
                     @Override
                     @SuppressWarnings("unchecked")
-                    public Object convert(String value) throws Exception {
+                    public Object convert(final String value) throws Exception {
                         return Enum.valueOf((Class<Enum>) type, value);
                     }
                 };
@@ -2582,15 +2583,15 @@ public class CommandLine {
             throw new MissingTypeConverterException(CommandLine.this, "No TypeConverter registered for " + type.getName() + " of field " + field);
         }
 
-        private void assertNoMissingParameters(Field field, int arity, Stack<String> args) {
+        private void assertNoMissingParameters(final Field field, final int arity, final Stack<String> args) {
             if (arity > args.size()) {
                 if (arity == 1) {
                     if (field.isAnnotationPresent(Option.class)) {
                         throw new MissingParameterException(CommandLine.this, "Missing required parameter for " +
                                 optionDescription("", field, 0));
                     }
-                    Range indexRange = Range.parameterIndex(field);
-                    Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();
+                    final Range indexRange = Range.parameterIndex(field);
+                    final Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();
                     String sep = "";
                     String names = "";
                     int count = 0;
@@ -2603,7 +2604,7 @@ public class CommandLine {
                         }
                     }
                     String msg = "Missing required parameter";
-                    Range paramArity = Range.parameterArity(field);
+                    final Range paramArity = Range.parameterArity(field);
                     if (paramArity.isVariable) {
                         msg += "s at positions " + indexRange + ": ";
                     } else {
@@ -2619,11 +2620,11 @@ public class CommandLine {
                         " requires at least " + arity + " values, but only " + args.size() + " were specified: " + reverse(args));
             }
         }
-        private String trim(String value) {
+        private String trim(final String value) {
             return unquote(value);
         }
 
-        private String unquote(String value) {
+        private String unquote(final String value) {
             return value == null
                     ? null
                     : (value.length() > 1 && value.startsWith("\"") && value.endsWith("\""))
@@ -2633,8 +2634,8 @@ public class CommandLine {
     }
     private static class PositionalParametersSorter implements Comparator<Field> {
         @Override
-        public int compare(Field o1, Field o2) {
-            int result = Range.parameterIndex(o1).compareTo(Range.parameterIndex(o2));
+        public int compare(final Field o1, final Field o2) {
+            final int result = Range.parameterIndex(o1).compareTo(Range.parameterIndex(o2));
             return (result == 0) ? Range.parameterArity(o1).compareTo(Range.parameterArity(o2)) : result;
         }
     }
@@ -2647,25 +2648,25 @@ public class CommandLine {
         }
         static class StringConverter implements ITypeConverter<String> {
             @Override
-            public String convert(String value) { return value; }
+            public String convert(final String value) { return value; }
         }
         static class StringBuilderConverter implements ITypeConverter<StringBuilder> {
             @Override
-            public StringBuilder convert(String value) { return new StringBuilder(value); }
+            public StringBuilder convert(final String value) { return new StringBuilder(value); }
         }
         static class CharSequenceConverter implements ITypeConverter<CharSequence> {
             @Override
-            public String convert(String value) { return value; }
+            public String convert(final String value) { return value; }
         }
         /** Converts text to a {@code Byte} by delegating to {@link Byte#valueOf(String)}.*/
         static class ByteConverter implements ITypeConverter<Byte> {
             @Override
-            public Byte convert(String value) { return Byte.valueOf(value); }
+            public Byte convert(final String value) { return Byte.valueOf(value); }
         }
         /** Converts {@code "true"} or {@code "false"} to a {@code Boolean}. Other values result in a ParameterException.*/
         static class BooleanConverter implements ITypeConverter<Boolean> {
             @Override
-            public Boolean convert(String value) {
+            public Boolean convert(final String value) {
                 if ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value)) {
                     return Boolean.parseBoolean(value);
                 } else {
@@ -2675,7 +2676,7 @@ public class CommandLine {
         }
         static class CharacterConverter implements ITypeConverter<Character> {
             @Override
-            public Character convert(String value) {
+            public Character convert(final String value) {
                 if (value.length() > 1) {
                     throw new TypeConversionException("'" + value + "' is not a single character");
                 }
@@ -2685,45 +2686,45 @@ public class CommandLine {
         /** Converts text to a {@code Short} by delegating to {@link Short#valueOf(String)}.*/
         static class ShortConverter implements ITypeConverter<Short> {
             @Override
-            public Short convert(String value) { return Short.valueOf(value); }
+            public Short convert(final String value) { return Short.valueOf(value); }
         }
         /** Converts text to an {@code Integer} by delegating to {@link Integer#valueOf(String)}.*/
         static class IntegerConverter implements ITypeConverter<Integer> {
             @Override
-            public Integer convert(String value) { return Integer.valueOf(value); }
+            public Integer convert(final String value) { return Integer.valueOf(value); }
         }
         /** Converts text to a {@code Long} by delegating to {@link Long#valueOf(String)}.*/
         static class LongConverter implements ITypeConverter<Long> {
             @Override
-            public Long convert(String value) { return Long.valueOf(value); }
+            public Long convert(final String value) { return Long.valueOf(value); }
         }
         static class FloatConverter implements ITypeConverter<Float> {
             @Override
-            public Float convert(String value) { return Float.valueOf(value); }
+            public Float convert(final String value) { return Float.valueOf(value); }
         }
         static class DoubleConverter implements ITypeConverter<Double> {
             @Override
-            public Double convert(String value) { return Double.valueOf(value); }
+            public Double convert(final String value) { return Double.valueOf(value); }
         }
         static class FileConverter implements ITypeConverter<File> {
             @Override
-            public File convert(String value) { return new File(value); }
+            public File convert(final String value) { return new File(value); }
         }
         static class URLConverter implements ITypeConverter<URL> {
             @Override
-            public URL convert(String value) throws MalformedURLException { return new URL(value); }
+            public URL convert(final String value) throws MalformedURLException { return new URL(value); }
         }
         static class URIConverter implements ITypeConverter<URI> {
             @Override
-            public URI convert(String value) throws URISyntaxException { return new URI(value); }
+            public URI convert(final String value) throws URISyntaxException { return new URI(value); }
         }
         /** Converts text in {@code yyyy-mm-dd} format to a {@code java.util.Date}. ParameterException on failure. */
         static class ISO8601DateConverter implements ITypeConverter<Date> {
             @Override
-            public Date convert(String value) {
+            public Date convert(final String value) {
                 try {
                     return new SimpleDateFormat("yyyy-MM-dd").parse(value);
-                } catch (ParseException e) {
+                } catch (final ParseException e) {
                     throw new TypeConversionException("'" + value + "' is not a yyyy-MM-dd date");
                 }
             }
@@ -2732,7 +2733,7 @@ public class CommandLine {
          * {@code HH:mm:ss.SSS}, {@code HH:mm:ss,SSS}. Other formats result in a ParameterException. */
         static class ISO8601TimeConverter implements ITypeConverter<Time> {
             @Override
-            public Time convert(String value) {
+            public Time convert(final String value) {
                 try {
                     if (value.length() <= 5) {
                         return new Time(new SimpleDateFormat("HH:mm").parse(value).getTime());
@@ -2741,11 +2742,11 @@ public class CommandLine {
                     } else if (value.length() <= 12) {
                         try {
                             return new Time(new SimpleDateFormat("HH:mm:ss.SSS").parse(value).getTime());
-                        } catch (ParseException e2) {
+                        } catch (final ParseException e2) {
                             return new Time(new SimpleDateFormat("HH:mm:ss,SSS").parse(value).getTime());
                         }
                     }
-                } catch (ParseException ignored) {
+                } catch (final ParseException ignored) {
                     // ignored because we throw a ParameterException below
                 }
                 throw new TypeConversionException("'" + value + "' is not a HH:mm[:ss[.SSS]] time");
@@ -2753,28 +2754,28 @@ public class CommandLine {
         }
         static class BigDecimalConverter implements ITypeConverter<BigDecimal> {
             @Override
-            public BigDecimal convert(String value) { return new BigDecimal(value); }
+            public BigDecimal convert(final String value) { return new BigDecimal(value); }
         }
         static class BigIntegerConverter implements ITypeConverter<BigIntege

<TRUNCATED>