Java – how to avoid instanceof calls?
•
Java
I defined this simple method:
public static boolean isBorder(int x,int y) throws CollisionDetectionException { try { if ( (levelItems[x][y] instanceof StaticGameObject && levelItems[x][y].isVisible()) || (levelItems[x-1][y] instanceof StaticGameObject && levelItems[x-1][y].isVisible()) || (levelItems[x][y+1] instanceof StaticGameObject && levelItems[x][y+1].isVisible()) || (levelItems[x][y-1] instanceof StaticGameObject && levelItems[x][y-1].isVisible()) || (levelItems[x-1][y-1] instanceof StaticGameObject && levelItems[x-1][y-1].isVisible()) || (levelItems[x-1][y+1] instanceof StaticGameObject &&levelItems[x-1][y+1].isVisible()) || (levelItems[x+1][y] instanceof StaticGameObject && levelItems[x+1][y].isVisible()) || (levelItems[x+1][y+1] instanceof StaticGameObject && levelItems[x+1][y+1].isVisible()) || (levelItems[x+1][y-1] instanceof StaticGameObject && levelItems[x+1][y-1].isVisible()) ) { return true; } else { return false; } } catch (Arrayindexoutofboundsexception e) { throw new CollisionDetectionException("Collision Couldn't be checked because checking position " + x + "/" + y + " caluclated values below (0/0)"); } }
As you can see, I have a two - dimensional array Now I want to check for a specific location ((x / y) – > method parameters) if there are any visible staticgameobjects in the adjacent fields of the 2-dimensional array
The levelitems array consists of so - called GameObjects Staticgameobject is a direct subclass of GameObject
Any tips on how to improve this method?
Solution
Add method to GameObject
bool isBorderObject() { return false; }
Then override in staticgameobject
bool isBorderObject() { return true; }
Change test to
(levelItems[x][y].isBorderObject() && levelItems[x][y].isVisible())
In addition, if may be nested
for (int i = x-1; i <= x+1; ++i) { for (int j = y-1; j <= y+1; ++j) { GameObject item = levelItems[i][j]; if (item.isBorderObject() && item.isVisible()) return true; } } return false;
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码