classes:
public abstract class BaseHolidayPackageVariant {
private Integer variantId;
private HolidayPackage holidayPackage;
private String holidayPackageType;
}
public class LandHolidayPackageVariant extends BaseHolidayPackageVariant{
}
public class FlightHolidayPackageVariant extends BaseHolidayPackageVariant{
private Destination originCity;
}
public class HolidayPackage{
ArrayList<BaseHolidayPackageVariant> variants;
BaseHolidayPackageVariant defaultVariant;
}
At runtime, how can I know if a given Object in variants[] is of Type LandPackageVariant or FlightPackageVariant without doing something of the sorts of:
if(holidayPackageType.equals("LandHolidayPackageVariant")
obj = (LandHolidayPackageVariant)variant[i];
else if(holidayPackageType.equals("FlightHolidayPackageVariant")
obj = (FlightHolidayPackageVariant)variant[i];
This question stems from a design question I asked here
In a good object-oriented design, you shouldn’t ever need to know if the object is of a particular type. You just call methods on it, and the object does the right thing.
For example,
FlightHolidayPackageVarianthas a fieldoriginCitythat isn’t in the otherHolidayPackageVariantclasses, and you want to render that in the UI. The object-oriented way to solve this is to make theHolidayPackageVariantresponsible, in some way, for controlling its own rendering. Let’s say your UI is going to show a list of properties for each variant. You can let the variants supply those lists:Now, your UI code can simply ask each variant object for its details, without having to know what kind of variant it is.