Скажем, у меня есть несколько экземпляров этого класса:
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
Как я могу это сделать?
Вы получаете экземпляр 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: n в реляционных базах данных - у вас есть 1 звезда, у которой есть n планет, и каждая из планет принадлежит 1 звезде. В базе данных вы должны моделировать это с помощью внешнего ключа в каждой таблице.
В Java вы можете сопоставить его так же (что вы на самом деле делаете при попытке моделировать это отношение через JPA): звезда содержит список всех планет, а на планете есть поле, содержащее звезду.
Вам нужно иметь ссылку на звезду внутри вашей планеты. вы не можете получить экземпляр без него.
public class Planet {
private Star star;
public void setStar(Star star)
{
this.star = star;
}
public Star getStar()
{
return this.star;
}
}
Вы действительно не можете. Как показано, между планетаю и звездой нет связи.
Вы можете просмотреть иерархию классов. У вас в настоящее время есть Звезда с отношением 'has-a' к Planet и Comet. Разве это не галактика, которая содержит все 3? Или, может быть, вы хотите, чтобы планета имела отношение "есть-а" к Star