Hier schon die erste Frage: Das static vor den Points erfüllt nur den Zweck, die Fehlermeldung "Cannot make a static reference to the non-static field" zu umgehen - gibt's da vielleicht ne elegantere Lösung?
Weiterhin existiert eine zweite Klasse, die diese einzelnen Punkte einer ArrayList hinzufügt:
Code:
import java.util.ArrayList;
import java.util.List;
public class DefaultList {
public DefaultList() {
List<Point> pointlist = new ArrayList<Point>();
pointlist.add(ALotOfPoints.p1);
pointlist.add(ALotOfPoints.p2);
pointlist.add(ALotOfPoints.p3);
}
}
Mir stellt sich nun die nach ausreichend Internetrecherche immernoch nicht beantwortete Frage, wie ich jetzt aus der Mainclass auf einzelne Elemente der ArrayList zugreifen kann? Das hier erschien mir logisch, funktioniert aber jedenfalls nicht:
Das ist der Fall in der Main, da du dich dort in einem statischen Kontext (public static void main ...) befindest.
Du kannst aber ein neues Objekt "ALotOfPoints" instanziieren.
Generell würde ich hier auf "static" komplett verzichten. Brauchst du die Klasse "DefaultListe" wirklich?
So fände ich es persönlich angenehmer.
Code:
public class ALotOfPoints {
private Point p1;
private Point p2;
private Point p3;
private List<Point> pointList;
public ALotOfPoints(){
pointList = new ArrayList<>();
p1 = new Point(-3.678,-83.689);
p2 = new Point(-73.440,81.76);
p3= new Point(0.667,-18.607);
pointList.addAll(p1,p2,p3);
}
public List<Point> getPoints(){
return pointList;
}
}
Code:
public class Mainclass {
public static void main(String[] args) {
System.out.println(new ALotOfPoints().getPoints().get(0));
}
}
Je nachdem, ob sich die Punkte nochmal ändern sollen oder nicht, würde ich diese final machen (oder eben nicht).
Generell bin ich davon abgeneigt, Klassenattribute als public static zu deklarieren.
@Flown Obenstehendes ist nur Vorläufer für ein Programm zur Ermittlung der BoundingBox einer Punktwolke, ich als blutiger Anfänger wollte mich nur mit so einer grundlegenden Aufgabe mit dem Konzept von ArrayLists vetraut machen, da ich damit zuvor noch die gearbeitet habe. @Kababär Die Klasse DefaultList ist in ihrer Form unumgänglich, da die Punkte aus einer anderen Quelle in dieser Form ausgegeben werden. Insofern löst eine Umstrukturierung mein Problem nicht, da aus der Mainclass auf die pointlist zugreifen muss.
Nochmal konkret das eigentliche Problem: Was ist an System.out.println(DefaultList.pointlist.p1); falsch, wenn man aus der Mainclass auf eine ArrayList in einer anderen Klasse zugreifen möchte?
deklarierst du eine Liste von Punkten im Konstruktor. Diese Liste müsste eigentlich als Klassenattribut deklariert werden, wenn du diese Liste außerhalb der Klasse benötigst.
Also ungefähr so:
Code:
public class DefaultList {
public static List<Point> pointlist;
public DefaultList() {
pointList = new ArrayList<Point>();
pointlist.add(ALotOfPoints.p1);
pointlist.add(ALotOfPoints.p2);
pointlist.add(ALotOfPoints.p3);
}
}
Dann solltest du mit dem Sout/Sysout keine Probleme haben.
Um allerdings auf Attribute von Objekten zuzugreifen, verwendet man meistens Getter & Setter.