I'm writing an open source library which handles hexagonal grids. It mainly revolves around the HexagonalGrid
and the Hexagon
class. There is a HexagonalGridBuilder
class which builds the grid which contains Hexagon
objects. What I'm trying to achieve is to enable the user to add arbitrary data to each Hexagon
. The interface looks like this:
public interface Hexagon extends Serializable {
// ... other methods not important in this context
<T> void setSatelliteData(T data);
<T> T getSatelliteData();
}
So far so good. I'm writing another class however named HexagonalGridCalculator
which adds some fancy pieces of computation to the library like calculating the shortest path between two Hexagon
s or calculating the line of sight around a Hexagon
. My problem is that for those I need the user to supply some data for the Hexagon
objects like the cost of passing through a Hexagon
, or a boolean
flag indicating whether the object is transparent/passable or not.
My question is how should I implement this?
My first idea was to write an interface like this:
public interface HexagonData {
void setTransparent(boolean isTransparent);
void setPassable(boolean isPassable);
void setPassageCost(int cost);
}
and make the user implement it but then it came to my mind that if I add any other functionality later all code will break for those who are using the old interface.
So my next idea is to add annotations like
@PassageCost
, @IsTransparent
and @IsPassable
which can be added to fields and when I'm doing the computation I can look for the annotations in the satelliteData
supplied by the user. This looks flexible enough if I take into account the possibility of later changes but it uses reflection. I have no benchmark of the costs of using annotations so I'm a bit in the dark here.
I think that in 90-95% of the cases the efficiency is not important since most users wont't use a grid where this is significant but I can imagine someone trying to create a grid with a size of 5.000.000.000 X 5.000.000.000
.
So which path should I start walking on? Or are there some better alternatives?
Note: These ideas are not implemented yet so I did not pay too much attention to good names.