I tried to parse command line arguments. The program requires four arguments. I iterate over the arguments. If the argument is an option, I process the option. Otherwise the argument is one of the required arguments. In order to read the required arguments I need some kind of state machine. In the first case the first argument should be read. In the second case the second argument and so on.
I wrote a Proc class with just one method, which returns again a Proc class.
static abstract class Proc { abstract Proc exec (String arg); } By this I can execute some action and define what should be done next.
- save db host and then read name
- save db name and then read user
- save db user and then read xml file
- save xml file and then nothing
But because of all the class overhead it is hard to read.
Proc proc = new Proc () { Proc exec (String arg) { db_host = arg; return new Proc () { Proc exec (String arg) { db_name = arg; return new Proc () { Proc exec (String arg) { db_user = arg; return new Proc () { Proc exec (String arg) { xml_file = arg; return null; } }; } }; } }; } }; Is there a way to simplify the code? I tried Lambdas, but it seems to me that Lambdas can use only final variables, which is a bit useless, when I want to store a value.
Complete example:
public class Import { static String db_host = null; static String db_port = "5432"; static String db_name = null; static String db_user = null; static String xml_file = null; static void usage () { System.err.println ("Usage: Import [-p PORT] HOST DATABASE USER FILE"); } static abstract class Proc { abstract Proc exec (String arg); } static void parse_args (String[] args) { Proc proc = new Proc () { Proc exec (String arg) { db_host = arg; return new Proc () { Proc exec (String arg) { db_name = arg; return new Proc () { Proc exec (String arg) { db_user = arg; return new Proc () { Proc exec (String arg) { xml_file = arg; return null; } }; } }; } }; } }; try { for (int i = 0; i < args.length; i++) switch (args[i]) { case "-p": db_port = args[++i]; break; case "-h": usage (); break; default: proc = proc.exec (args[i]); } } catch (Exception ex) { throw new Error ("Can not parse args!", ex); } } public static void main (String[] args) { parse_args (args); System.err.println ("db_host: " + db_host); System.err.println ("db_port: " + db_port); System.err.println ("db_name: " + db_name); System.err.println ("db_user: " + db_user); System.err.println ("xml_file: " + xml_file); } }