在toString中使用equals或instanceof

时间:2013-09-19 14:40:50

标签: java clone equals tostring instanceof

好的家伙我有一个带有'MartianManager'类的程序:*注意代码不完整仍然有一些缺失的部分只是提供了整个代码,以供参考完成时看起来如何

import java.util.ArrayList;

public class MartianManager {
private ArrayList<Martian> martians;
private ArrayList<Martian> teleporters;

public void addMartian(Martian m) {
    martians.add(m);
    if(m instanceof GreenMartian)
        teleporters.add(m);
}
//public Object clone() {

public Martian getMartianClosestToID(int id) {  
}
public void groupSpeak() {
    for(Martian m : martians) {
        m.speak();
    }
}
public void groupTeleport(String dest) {    
}
}

和火星级:

public abstract class Martian implements Cloneable {
int id;

public Martian(int id) {
    this.id = id;
}
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}
public int getId() {
    return id;
}
public boolean equals(Object o){
    return this.getId() == ((Martian)o).getId();    
}
public abstract void speak();

public String toString(){
    String str = "";
    if (this instanceof GreenMartian) {
        str = "Green martian" + id;
    }
    if (this instanceof RedMartian) {
        str = "Red martian" + id;
    }
    return str;
}       
}

它与GreenMartian一起扩展:

public class GreenMartian extends Martian implements ITeleport{

public GreenMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Grobldy Grock");
}
public void teleport(String dest) {
    System.out.println(id + "teleporting to " + dest);
}

}

也扩展了RedMartian:

public class RedMartian extends Martian {

public RedMartian(int id) {
    super(id);
}
public void speak() {
    System.out.println(id + "Rubldy Rock");
}
}

我实际上有几个问题,但是现在我的问题是在火星类的toString中。它应该返回一个这样的字符串:“Red [或Green] martian”+ id。我需要确定火星人的类型,我开始使用instanceof但是像这样“火星人无法解析为变量”。我正在尝试确定这是否是最好的方法,或者equals()是否是确定类型的最佳方法?

这也是我第一次使用“克隆”,所以不确定它是如何工作的,但有一种想法是否有办法确定“克隆”是什么并确定它的方式?

感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

没有

public String toString(){
    String str;
    if (Martian instanceof GreenMartian) {  
}
abstract Martian课程中的

是一个坏主意。您不希望父类依赖其子级。

在每个子类中实现toString()方法而让多态实现其工作


如果你绝对必须

if (Martian instanceof GreenMartian) {  

错了。您使用instanceof

instanceOfClass instanceof SomeClass

在这种情况下,您会使用instanceOfClass关键字引用this,因为您在实例上调用方法

this instanceof GreenMartian

答案 1 :(得分:1)

你真的不应该有一个父类引用任何扩展它的类。这是不好的做法(可能实际上没有用,我还没有测试过)。你应该只是覆盖每个扩展类中的toString函数。

public class GreenMartian extends Martian implements ITeleport{

    public GreenMartian(int id) {
        super(id);
    }
    public void speak() {
        System.out.println(id + "Grobldy Grock");
    }
    public void teleport(String dest) {
        System.out.println(id + "teleporting to " + dest);
    }

    @Override
    public String toString() {
         return "GreenMartian: whatever info you'd like to include.";
    }

}

现在,如果您希望所有子类具有类似的格式,则有两个选项。一种是调用父类的toString方法,并将其添加到子类的toString方法。

@Override
public String toString() {
    return super.toString() + "GreenMartin: info.....";
}

//The parent toString could look like this:
@Override
public String toString(){
    return "Martian( ... put any parent class info here, id ect)";
}

GreenMartian toString调用的最终输出可能如下所示:

Martian(id:23) GreenMartian(planet:greenburg)

第三种选择是在父类中使用通用字符串格式。例如,在父类中,包括此属性:

protected static final String format = "Class: %s, id: %s, info: %s";

然后,在子类toString中,您可以这样做:

@Override
public String toString() {
    return String.format(format,this.getClass().toString(),id,myInfo);
}

答案 2 :(得分:0)

您可以使用String name = this.getClass().getSimpleName()获取课程名称。然后,您可以检查name.substring(0,1).equals("G")name.substring(0,1).equals("R")以检测红色或绿色。

答案 3 :(得分:0)

FWIW,它应该是if (this instanceof GreenMartian) - 但是每当你想要使用这样的低垂(up ??)时,恕我直言,这是一个糟糕的OO设计的标志。而是为你的火星人写一个专门的toString()方法。您应该在o==null方法中检查equals()

答案 4 :(得分:0)

火星不是变量。试试这个:

  

if(此实例为GreenMartian)