Re: How can I use a string as a parameter to produce a new class
instance?
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,double,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