Java 使用instanceof或public方法获取实例
所以我有3门课: 项目 GroupItem扩展了项目 ProductItem扩展项目 我正在将一个Item对象数组传递给一个类,并希望根据它们的类类型执行不同的操作 使用instanceof是一种可以接受的方法吗?或者我是否应该有一个内部布尔isGroup方法,该方法将在初始化指定的子类时设置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
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();
...
}
}