Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - Alternatives to forcing subclass to have a static method

Tags:

java

I often find I want to do something like this:

class Foo{
public static abstract String getParam();
}

To force a subclasses of Foo to return a parameter.

I know you can't do it and I know why you can't do it but the common alternative of:

class Foo{
public abstract String getParam();
}

Is unsatisfactory because it requires you to have an instance which is not helpful if you just want to know the value of the parameter and instantiating the class is expensive.

I'd be very interested to know of how people get around this without getting into using the "Constant Interface" anti pattern.

EDIT: I'll add some more detail about my specific problem, but this is just the current time when I've wanted to do something like this there are several others from the past.

My subclasses are all data processors and the superclass defines the common code between them which allows them to get the data, parse it and put it where it needs to go. The processors each require certain parameters which are held in an SQL database. Each processor should be able to provide a list of parameters that it requires and the default values so the configuration database can be validated or initialised to defaults by checking the required parameters for each processor type. Having it performed in the constructor of the processor is not acceptable because it only needs to be done once per class not once per object instance and should be done at system startup when an instance of each type of class may not yet be needed.

like image 993
Nick Long Avatar asked Aug 13 '12 16:08

Nick Long


People also ask

Can we override static method in subclass?

The static method is resolved at compile time cannot be overridden by a subclass. An instance method is resolved at runtime can be overridden. A static method can be overloaded.

What is the alternative to static in Java?

You can use the full power of inheritance and overriding since your methods are no longer static. You can use the constructor to do any initialisation, including associating SQL with the table (SQL that your methods can use later). This should make all your problems above go away, or at least get much simpler.

Can subclasses access static methods?

All methods that are accessible are inherited by subclasses. The only difference with inherited static (class) methods and inherited non-static (instance) methods is that when you write a new static method with the same signature, the old static method is just hidden, not overridden.

Can we override static method in inheritance?

Overloading is the mechanism of binding the method call with the method body dynamically based on the parameters passed to the method call. Static methods are bonded at compile time using static binding. Therefore, we cannot override static methods in Java.


1 Answers

The best you can do here in a static context is something like one of the following:

a. Have a method you specifically look for, but is not part of any contract (and therefore you can't enforce anyone to implement) and look for that at runtime:

 public static String getParam() { ... };
 try {
     Method m = clazz.getDeclaredMethod("getParam");
     String param = (String) m.invoke(null);
 }
 catch (NoSuchMethodException e) {
   // handle this error
 }

b. Use an annotation, which suffers from the same issue in that you can't force people to put it on their classes.

@Target({TYPE})
@Retention(RUNTIME)
public @interface Param {
   String value() default "";
}

@Param("foo")
public class MyClass { ... }


public static String getParam(Class<?> clazz) {
   if (clazz.isAnnotationPresent(Param.class)) {
      return clazz.getAnnotation(Param.class).value();
   }
   else {
      // what to do if there is no annotation
   }
}
like image 193
Matt Avatar answered Sep 18 '22 05:09

Matt