Re: non-static method gotcha
Roedy Green wrote:
I was getting an compiler error message: non-static method cannot be
referenced from a static context. I am quite familiar with the
message, and normally I know what the problem is. This time I was
hitting a brick wall trying to figure it out. See if you can see the
problem. Hint, enum possibilities are their own little classes.
enum SubmissionSite
{
ABABASOFT( "AbabaSoft",
"http://www.ababasoft.com/catalog/submit.php" )
{
/**
* Simulate manual submit
*
* @param pad URL of the pad xml file we are
submitting.
*/
String submit( String pad )
{
> > > > > > > > > > return submitViaPost( "/checkadd.php",
"padurl", pad,
"psubmit", "Submit PAD File"
);
}
}, // end ABASOFT
.......
/**
* submit pad via POST with given parms
*
* @param action action, usually with lead /
* @param postParms parm=value pairs, including parmurl=pad
*
* @return text the website sent back.
*/
private String submitViaPost( String action, String... postParms )
{
...
}
/**
* Submit the PAD to this submission site.
*
* @param pad URL of pad e.g. http://mindprod/pad/fileio.xml
*
* @return what site said back, raw.
*/
abstract String submit( String pad );
} // end SubmissionSite
The reason is that enums with bodies are implemented as nested subclasses of
the declared enum, 'SubmissionSite' in your example. The error message spoke
of non-static method in a static context because the only way for a nested
class to access a private method of the outer class is via an outer reference,
in this case a non-static one. The subclass cannot inherit a private method,
and being an enum is a static nested class, hence the error.
When you have a package-private or wider scope for the method in the outer
class, the nested subclass inherits it, so the question of static context goes
away.
--
Lew