Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a Convienience Method to Existing Class (Class Cast Exception)

Java/Android noob here (Still) I hoped you could help.

I was trying to add a small convenience method to get the number of time that has passed rather than the number of time since EPOCH.

So I tried to do this:

public class EasyLocation extends android.location.Location {

    ...

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }
}

However when I tried to use it like in the code below which casts it to my Location class. I got a class cast exception. I've read up on it and I fully understand why it doesn't work. That's not the issue.

The issue is: it's not a train smash but I would like to have what is returned to have my method on it to make the rest of my code a bit cleaner. I can't figure out a way around it. Any ideas on how to do that?

lastNetworkLocation = (EasyLocation) locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

Thanks,

Gerard.

like image 550
guided1 Avatar asked Oct 11 '22 02:10

guided1


1 Answers

You can't do it like that. (A Location is not an EasyLocation.)

I believe what you're looking for is the decorator pattern.

You would typically do something like this:

public class EasyLocation extends android.location.Location {

    public EasyLocation(Location loc) {
        // copy data from loc to this.
        super(loc);
    }
    ...

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }
}

And instead of doing

lastNetworkLocation =
    (EasyLocation) locationManager.getLastKnownLocation(
                                              LocationManager.NETWORK_PROVIDER);

you do

lastNetworkLocation =
    new EasyLocation(locationManager.getLastKnownLocation(
                                              LocationManager.NETWORK_PROVIDER));

Keep in mind though that most people would probably say "Favor composition over inheritance", and go with

public class EasyLocation {

    Location loc;

    public EasyLocation(Location loc) {
        this.loc = loc;
    }

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }

    public Location getLocation() {
        return loc;
    }
}
like image 92
aioobe Avatar answered Oct 14 '22 02:10

aioobe