CommandLineOptionParser なるものを作った。

ダウンロード kakkun61.jar

何これ

コマンドライン引数の処理をするよ。

まず、使い方

-d と --debug でデバッグを有効にしたいとき。(Debug.setActive(true)にしたいとき。)

CommandLineOptionParser parser = new CommandLineOptionParser();
CommandLineOption debugOpt = new CommandLineOption( new String[]{"-d", "--debug"}, true );
parser.addOption( debugOpt );
parser.parse( args );
Debug.setActive( debugOpt.isExisting() );

とする。
CommandLineOption のコンストラクタの第2引数は、そのコマンドラインオプションが引数をとらなければ、true、とるなら、false。反対のほうがいいかもしれないが、英語で nullary なら true と考える。
CommandLineOption#isExisting() でそのオプションが与えられたかを知り、引数がある場合は CommandLineOption#getParameter() で得る。
CommandLineOption のコンストラクタの第2引数で、true を指定したのに CommandLineOption#getParameter() を呼び出した場合は、null が返る。
実行時にユーザから期待されないコマンドラインオプションが与えられた場合、CommandLineOptionParser#parse(String[]) は InvalidCommandLineOptionException をスローする。

次に、CommandLineOptionParser と CommandLineOption と InvalidCommandLineOptionException の中身

CommandLineOption
package kakkun61.cmdline;

public class CommandLineOption
{
  private String[] names;
  private boolean nullary;
  private boolean existing;
  private String parameter;

  public CommandLineOption( String[] names, boolean nullary )
  {
    this.names = names;
    this.nullary = nullary;
  }

  public boolean match( String arg )
  {
    for( int i=0; i<names.length; i++ )
      if( names[i].equals( arg ) )
        return existing = true;
    return false;
  }

  boolean isNullary()
  {
    return nullary;
  }

  public boolean isExisting()
  {
    return existing;
  }

  void setExisting( boolean existing )
  {
    this.existing = existing;
  }

  public String getParameter()
  {
    return parameter;
  }

  void setParameter( String parameter )
  {
    this.parameter = parameter;
  }
}
CommandLineOptionParser
package kakkun61.cmdline;

import java.util.ArrayList;
import java.util.List;

public class CommandLineOptionParser
{
  private List<CommandLineOption> opts = new ArrayList<CommandLineOption>();

  public void addOption( CommandLineOption opt )
  {
    opts.add( opt );
  }

  public void addOptions( CommandLineOption[] opts )
  {
    for( CommandLineOption opt : opts )
      this.opts.add( opt );
  }

  public void parse( String[] args ) throws InvalidCommandLineOptionException
  {
    ARG_LOOP: for( int i=0; i<args.length; )
    {
      for( CommandLineOption opt: opts )
        if( opt.match( args[i] ) )
        {
          if( opt.isNullary() )
            i++;
          else
          {
            opt.setParameter( args[i+1] );
            i+=2;
          }
          continue ARG_LOOP;
        }
      throw new InvalidCommandLineOptionException( "invalid command line option: " + args[i] );
    }
  }
}
InvalidCommandLineOptionException

単にスーパークラスのコンストラクタをオーバーライドするだけ。

package kakkun61.cmdline;

public class InvalidCommandLineOptionException extends IllegalArgumentException
{
  public InvalidCommandLineOptionException()
  {
    super();
  }

  public InvalidCommandLineOptionException( String message, Throwable cause )
  {
    super( message, cause );
  }

  public InvalidCommandLineOptionException( String s )
  {
    super( s );
  }

  public InvalidCommandLineOptionException( Throwable cause )
  {
    super( cause );
  }
}

ダウンロード kakkun61.jar