Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用instanceof或public方法获取实例_Java_Polymorphism_Subclass_Instanceof - Fatal编程技术网

Java 使用instanceof或public方法获取实例

Java 使用instanceof或public方法获取实例,java,polymorphism,subclass,instanceof,Java,Polymorphism,Subclass,Instanceof,所以我有3门课: 项目 GroupItem扩展了项目 ProductItem扩展项目 我正在将一个Item对象数组传递给一个类,并希望根据它们的类类型执行不同的操作 使用instanceof是一种可以接受的方法吗?或者我是否应该有一个内部布尔isGroup方法,该方法将在初始化指定的子类时设置 class Item { protected boolean isGroup = false; public boolean isGroupItem() { return isG

所以我有3门课:

项目 GroupItem扩展了项目 ProductItem扩展项目 我正在将一个Item对象数组传递给一个类,并希望根据它们的类类型执行不同的操作

使用instanceof是一种可以接受的方法吗?或者我是否应该有一个内部布尔isGroup方法,该方法将在初始化指定的子类时设置

 class Item {
      protected boolean isGroup = false;
      public boolean isGroupItem() { return isGroup; }
 }

 class GroupItem extends Item {
      public GroupItem() {
           isGroup = true;
      }
 }

 class ProductItem extends Item {
      public ProductItem() {
           isGroup = false;
      }
 }


 class Promotion {
      // Item can be either a group or a list of items
      private List<Item> items = new LinkedList<Item>;
      public void addItem(Item itemObj) {
           items.addItem(itemObj);
      }
      public List<Item> getItems() {
           return items;
      }
 }



 class Checker {
      // Items retrieved from Promotion and passed from another class as array
      public Checker(Item[] items) {
           // either

           if(items[0] instanceof GroupItem) {
                // Do something ...
           }

           // or

           if(items[0].isGroupItem()) {
                // Do something ...
           } 
      }
 }
因此,我的问题是:

实例或方法? 如果是方法、项目或促销? 为什么?这样我才能更好地理解其中的道理
提前感谢

这正是您应该使用instanceOf运算符的地方

instanceof运算符将对象与指定类型进行比较。你 可以使用它来测试一个对象是否是一个类的实例 子类的,或实现特定 接口

没有必要使用新方法或布尔属性来完成这项工作。您可以通过检查instanceOf轻松识别GroupItem的特定对象

您还可以使用GroupItem.class.isInstanceitems[0]来检查相同的设置。像-

if(GroupItem.class.isInstance(items[0])) {
      // Do something ...
}

我想我会尝试定义为什么我需要知道在这一点上它是否是一个群体

假设要确定一个项目是否符合升级条件,并且升级规则可能会更改:那么我将使用instanceof,因为您不希望升级规则逻辑污染您的基本对象

如果是一个组是你的项目的一个重要属性,在不同的上下文中都是有用的,而不仅仅是促销规则,我将把它包含在项目级别。

< P>操作符是一个更好的选择,但我也会考虑使用.< /P>
对要作为参数传递的实际类型使用不同的方法

通常,使用实例表示模型中存在错误

如果需要对不同的子类型有不同的行为,这意味着您没有真正使用父类型。此外,您必须了解实施细节,但实际情况并非如此


如果您拥有的继承只是技术上的继承,请尝试使用组合而不是继承。

因此在阅读本文之后,我为我的解决方案选择了不同的路径。谢谢所有帮助过我的人

由于Assylias和Balázs Mária Németh让我在使用抽象类获取所需信息时重新思考了自己的结构,我选择的解决方案甚至让我不必担心对象是什么子类型

 abstract class Item {
      public Item(...) {
           initialise();
           createSQLSegment();
      }

      protected String SQLSegment = "";
      protected abstract void createSQLSegment();
      public String getSQLSegment() {
           return SQLSegment;
      }

      ...
 }

 // Concrete class creates response
 class GroupItem extends Item {
      ...
      // Concrete method
      protected void createSQLStatement() {
           SQLStatement = "...SQL...";
      }
 }

 class ProductItem extends Item {
      ...
      // Concrete method
      protected void createSQLSegment() {
           SQLSegment = "...SQL..."
      }
 }


 class Promotion {
      // Item can be either a group or a list of items? extends Item>;
      public void addItem(Item itemObj) {
           items.addItem(itemObj);
      }
      public List<Item> getItems() {
           return items;
      }
 }



 class Checker {
      // Items retrieved from Promotion and passed from another class as array
      public Checker(Item[] items) {
           ...

           for(Item item : Items) {
                addPreparedSQLToBatch(item);
           }
      }

      private void addPreparedItemToBatch(Item item) {
           ...

           // No need to know concrete class
           SQLString += Item.getSQLSegment();

           ...
      }
 }
再次感谢大家


欢迎评论,我一直在学习:-

使用的实例更加通用和可读。感谢您的回复和回答。对于那些回答问题的人来说,还有一点信息:正在做的事情是,如果它是一个组,它需要添加到数据库表中的另一个字段中。这是因为如果该项是一个组,它需要添加到某些字段中,如果它不是,那么它将转到数据库中的其他字段中
 abstract class Item {
      public Item(...) {
           initialise();
           createSQLSegment();
      }

      protected String SQLSegment = "";
      protected abstract void createSQLSegment();
      public String getSQLSegment() {
           return SQLSegment;
      }

      ...
 }

 // Concrete class creates response
 class GroupItem extends Item {
      ...
      // Concrete method
      protected void createSQLStatement() {
           SQLStatement = "...SQL...";
      }
 }

 class ProductItem extends Item {
      ...
      // Concrete method
      protected void createSQLSegment() {
           SQLSegment = "...SQL..."
      }
 }


 class Promotion {
      // Item can be either a group or a list of items? extends Item>;
      public void addItem(Item itemObj) {
           items.addItem(itemObj);
      }
      public List<Item> getItems() {
           return items;
      }
 }



 class Checker {
      // Items retrieved from Promotion and passed from another class as array
      public Checker(Item[] items) {
           ...

           for(Item item : Items) {
                addPreparedSQLToBatch(item);
           }
      }

      private void addPreparedItemToBatch(Item item) {
           ...

           // No need to know concrete class
           SQLString += Item.getSQLSegment();

           ...
      }
 }