Dynamic method invocation isn't just sloooow (especially on that hot path!),
but also defeats (compile time) type safety.

The new interface isn't really required - we could directly check for
BuildingType directly. OTOH, having an interface gives us an bit of
semantic decoupling from Scope.
---
 src/net/sf/freecol/common/model/BuildingType.java  |  2 +-
 src/net/sf/freecol/common/model/Scope.java         |  7 ++++---
 .../freecol/common/model/SpecObjectTypeHolder.java | 24 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 4 deletions(-)
 create mode 100644 src/net/sf/freecol/common/model/SpecObjectTypeHolder.java

diff --git a/src/net/sf/freecol/common/model/BuildingType.java 
b/src/net/sf/freecol/common/model/BuildingType.java
index 9c6556fbde9..d8ab71471d6 100644
--- a/src/net/sf/freecol/common/model/BuildingType.java
+++ b/src/net/sf/freecol/common/model/BuildingType.java
@@ -40,7 +40,7 @@ import static net.sf.freecol.common.util.CollectionUtils.*;
  * of goods it produces and consumes.
  */
 public final class BuildingType extends BuildableType
-        implements BaseProduction {
+        implements BaseProduction, SpecObjectTypeHolder {
 
     public static final String TAG = "building-type";
 
diff --git a/src/net/sf/freecol/common/model/Scope.java 
b/src/net/sf/freecol/common/model/Scope.java
index 7f6f57b1f9f..98c43f0322c 100644
--- a/src/net/sf/freecol/common/model/Scope.java
+++ b/src/net/sf/freecol/common/model/Scope.java
@@ -198,12 +198,13 @@ public class Scope extends FreeColObject {
                 if (!type.equals(object.getId())) {
                     return matchNegated;
                 }
-            } else {
-                FreeColSpecObjectType fcgot = object.invokeMethod("getType",
-                    FreeColSpecObjectType.class, (FreeColSpecObjectType)null);
+            } else if (object instanceof SpecObjectTypeHolder) {
+                FreeColSpecObjectType fcgot = 
((SpecObjectTypeHolder)object).getType();
                 if (fcgot == null || !type.equals(fcgot.getId())) {
                     return matchNegated;
                 }
+            } else {
+                return matchNegated;
             }
         }
         if (abilityId != null && object.hasAbility(abilityId) != abilityValue) 
{
diff --git a/src/net/sf/freecol/common/model/SpecObjectTypeHolder.java 
b/src/net/sf/freecol/common/model/SpecObjectTypeHolder.java
new file mode 100644
index 00000000000..bcdb30c5204
--- /dev/null
+++ b/src/net/sf/freecol/common/model/SpecObjectTypeHolder.java
@@ -0,0 +1,24 @@
+/**
+ *  Copyright (C) 2002-2017   The FreeCol Team
+ *
+ *  This file is part of FreeCol.
+ *
+ *  FreeCol is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  FreeCol is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with FreeCol.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.sf.freecol.common.model;
+
+public interface SpecObjectTypeHolder {
+    public FreeColSpecObjectType getType();
+}
-- 
2.11.0.rc0.7.gbe5a750


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Freecol-developers mailing list
Freecol-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freecol-developers

Reply via email to