Question

I'm trying to refactor my code by using a BaseComponentType class and inheriting from this in my ElectricalComponentType class (and similar child classes), as follows:

BaseComponentType.java

public abstract class BaseComponentType {

    public static BaseComponentType findByUid ( Class klass, String uid ) {

        return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();

    }

}

ElectricalComponentType.java

public class ElectricalComponentType extends BaseComponentType {

    public static ElectricalComponentType findByUid( String uid ) {

        return (ElectricalComponentType) findByUid( ElectricalComponentType.class, uid );

    }

}

What I need to do is call ElectricalComponentType.findByUid( 'a1234' ) but it would be great if I did not have to define findByUid in the ElectricalComponentType class and instead could inherit this functionality from the BaseComponentType.

You'll notice that two things stand in the way:

  1. I need the ElectricalComponentType class in the findByUid parent method.

  2. I need to return ElectricalComponentType object (or whatever the child class object is) instead of a BaseComponentType class object.

Is there a way to do this?

Was it helpful?

Solution

Use generics and only have the parent class method:

public abstract class BaseComponentType {
    public static <T extends BaseComponentType> T findByUid(Class<T> klass, String uid) {
        return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();
    }
}

OTHER TIPS

There are several points to note:

  • static methods are not being inherited and cannot be overriden;
  • To call static method of your parent class, you have to write class name first: BaseComponentType.findById();

If you want to get rid of method with the same name in child class, you may want to make it non-static or/and reconsider your classes design, because if you have two static methods with the same names in classes bound with inheritance relation, most likely there is something wrong with class design.

i hope you need something like following..

public class TestClass{
    public static void main(String args[]){
        Child c2;
        c2 = (Child) Child.findByUid(Child.class, "123");
        System.out.println(c2.getClass());
    }            
}

class Base{
    public static Base findByUid ( Class klass, String uid ) {
        System.out.println(klass);
        Child c = new Child();
            //execute your query here and expect it to return the type of object as the class by which it was called
        //your parent class method always returns the type of the child by which the method was called
        return c;

    }

}

class Child extends Base{
    /*public static Child findByUid( String uid ) {
        System.out.println(Child.class);
        return (Child) findByUid( Child.class, uid );

    }*/
}

I think you could reengineer this so that you have a ComponentFinder class that finds Components.

public class ElectricalComponent extends Component {

     @Override
     public void method1(){
         //specific stuff
     }

}

public abstract class Component{
     public abstract void method1();
}

public class ComponentFinder{

    public static Component findByUid ( Class klass, String uid ) {

        return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();

    }

}

Then you don't have to worry about the inheritance issue.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top