| 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
|