Java refactoring: removing duplicate code

In the following scenario I have:

interface IClassA

abstract class ClassA implements IClassA

concrete classes ClassB1 and ClassB2 extend ClassA


ClassB1 and ClassB2 both have methods DoStuff()

The code for DoStuff() is identical in both ClassB1 and ClassB2

Is it possible to refactor this to get rid of the identical code?

public interface IClassA {

	public int DoStuff();
	public int ClassSpecific();
}



public abstract class ClassA implements IClassA {

	//public ClassA(){}
	
	public void aCommonMethod() {
	}
}



public class ClassB1 extends ClassA {
	
	public ClassB1(){}
	

	@Override
	public int DoStuff() 
	{
		return ClassSpecific();
	}


	@Override
	public int ClassSpecific()
	{
		return 9;
	}
}



public class ClassB2 extends ClassA {

	public ClassB2(){}

	
	@Override
	public int DoStuff() 
	{
		return ClassSpecific();
	}
	
	
	@Override
	public int ClassSpecific()
	{
		return 5;
	}
}

Open in new window

(Imagine DoStuff() is a lot more complicated than it is here, but it does have buried in it a call to ClassSpecific().)
deleydAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

dpearsonCommented:
Can you not just move DoStuff() to classA?

Doug
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
deleydAuthor Commented:
Here's my real doStuff() class:
    public double getValueAs(TemperatureUnits units) { 
		if (units == TemperatureUnits.FAHRENHEIT) {
            return asFahrenheit().doubleValue();
        }
        else if (units == TemperatureUnits.CELSIUS) {
            return asCelsius().doubleValue();
        }
        else if (units == TemperatureUnits.KELVIN) {
            return asKelvin().doubleValue();
        }
        else
        {
            throw new InvalidParameterException("Unhanded Temperature Unit " + units.toString());
        }
    }

Open in new window

methods asFahrenheit(), asCelsius(), asKelvin() are the Class Specific methods.

Moving the code to the abstract superclass (ClassA), it complains, because the superclass doesn't define asFahrenheit, asCelsius, asKelvin.
0
krakatoaCommented:
Make the methods static in the abstract class then.
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

deleydAuthor Commented:
I get:

"Cannot make a static reference to the non-static method ClassSpecific() from type IClassA."
0
dpearsonCommented:
In that case I think you'll want to define
asFahrenheit, asCelsius, asKelvin
in the interface/abstract class as well.

You'll need a common "something" (abstract class/interface) for the shared code to be able to call common methods like "asCelsius" and have them execute the right specific implementation.

As you say, since the code is identical this should be solvable with the right hierarchy.  But the interface (or abstract class) will need to include all of the methods that are shared between the two concrete classes.

Doug
0
deleydAuthor Commented:
I was missing the keyword 'abstract' !

I had public class AbstractClass

Now it works great once I noticed that. Thank you!
0
krakatoaCommented:
Well done Doug! ;)
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.