如何从属于它的一个实例变量中获取类的特定实例

时间:2014-09-29 20:36:40

标签: java class instance-variables

我们说我有这个类的多个实例:

public class Star {
    public Star(ArrayList<Planet> planets, ArrayList<Comet> comets) {
        pla = planets;
        com = comets;
    }
    // Getters and setters go here

    private ArrayList<Planet> pla;
    private ArrayList<Comet> com;
}

我如何使用Star的实例,例如,某个特定的Planet属于哪个?例如,请参阅此伪代码:

aSpecificPlanet.getInstanceOfClassThisBelongsTo().doStuffWithIt();

我在Planet的其中一个吸气者中试过这个:

public Star getStar() {
    return this.getClass();
}

但我收到此错误:incompatible types: Class<CAP#1> cannot be converted to Star

我该怎么做?

4 个答案:

答案 0 :(得分:3)

您正在获取Class个实例,而不是Star个实例。

您可以在Planet类型Star中添加一个字段,该字段将引用它所属的Star。每当您向Planet添加Star时,都可以设置此字段:

Star star = new Star(planets, comets);
for(Planet planet : planets) {
   planet.setStar(star);  // add this field
}

您可以将其置于实用程序方法中,以避免重复代码并确保一致性:

public void addPlanet(Star star, Planet planet) {
   if(star != null && planet != null) {
      star.getPlanets().add(planet); // assuming the list is always not null
      planet.setStar(star);
   }
}

答案 1 :(得分:1)

误解了这个问题 - 所以这里有一个更好的答案:

您正在寻找的是关系数据库中1:n关系的典型用例 - 您有1颗星有n个行星,每个行星属于1颗星。在数据库中,您可以使用每个表中的外键对其进行建模。

在Java中,你可以用同样的方式映射它(当你试图通过JPA模拟这种关系时你实际做的那样):星星包含所有行星的列表,行星有一个包含星星的字段。

答案 2 :(得分:0)

你真的不能'。如图所示,从星球到星星没有关联。

您可能希望查看您的类层次结构。你目前拥有Star与Planet和Comet的'has-a'关系。是不是真的是包含所有3个星系的星系?或者也许你希望Planet与Star有“一对一”的关系

答案 3 :(得分:0)

你需要引用你星球内的恒星。没有它你就无法获得实例。

public class Planet {
private Star star;

    public void setStar(Star star)
    {
       this.star = star;
    }
    public Star getStar()
    {
        return this.star;
    }
}