For Programmers: Free Programming Magazines  


Home > Archive > Java Help > December 2006 > Re: How can I use a string as a parameter to produce a new class









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Re: How can I use a string as a parameter to produce a new class
Eric Sosman

2006-12-16, 7:11 pm

chps wrote:
> Hello
>
> I'm trying to produce an instance of a Class by passing a number of
> parameters whcih have been read from a text file.
>
> e.g. String,boolean,boolean,int,int,int,doubl
e,double,double
>
> If I hard code it as below the programme runs
>
> Round r = new Round("American",true,true,60,50,40,2.5,2.5,2.5);
>
> However if I use the same string retrieved from the text file -
> "American",true,true,60,50,40,2.5,2.5,2.5 - and assigned to a String
> variable - roundinfo -
>
> Round r = new Round(roundinfo);
>
> it will not compile with the following error message.
>
> ReadRoundInfo.java:57: cannot find symbol
> symbol : constructor Round(java.lang.String)
> location : class Round
>
> I've tried any number of ways of getting the constructors to take the String
> argument failing each time. I suspect the problem is fundamental and
> something to do with the fact that a String is not a primitive. Do I have
> to encapsulate the string as an object? - and if so how do I do that?


Your problem (the immediate problem, anyhow) is not that String
is not primitive, but that the Round class has no constructor that
looks like

Round(String s) { ... }

You might write a constructor like this that broke its lone
String argument into pieces, converted some of the pieces to
boolean, some to int, and so on, and then called the "exploded"
Round constructor, somewhat like

Round(String s) {
// extract nine values from the single String:
String[] field = s.split(",");
boolean b1 = field[1].equals("true");
boolean b2 = field[2].equals("true");
int i3 = Integer.parseInt(field[3]);
int i4 = Integer.parseInt(field[4]);
int i5 = Integer.parseInt(field[5]);
double d6 = Double.parseDouble(field[6]);
double d7 = Double.parseDouble(field[7]);
double d8 = Double.parseDouble(field[8]);

// Pass extracted values to the other constructor:
this(field[0], b1, b2, i3, i4, i5, d6, d7, d8);
}

(Some robustification would probably be a good idea -- for
example, a parameter like "Foo,true,JUNK,1,2,3,4,5,6" would be
accepted by the code shown, as would "X,x,x,1,1,1,1,1,1,JUNK".
Meanwhile, "X,true,true, 1, 2, 3,4,5,6" would not be accepted,
and "\"London, England\",true,false,1,2,3,4,5,6" would be
misunderstood rather badly.)

If you cannot change the Round class itself (or if you decide
adding such a constructor would be inappropriate), you could put
all the string-parsing and argument-normalizing into a "helper"
factory method, like

static Round makeRound(String s) {
// decompose and convert s as above
return new Round(field[0],b1,b2,i3,i4,i5,d6,d7,d8);

}

--
Eric Sosman
esosman@acm-dot-org.invalid
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com