Die frage ist erst einmal, was ihr alles genau vor habt. Denn davon hängt schlicht das Design ab.
Eine übliche Sache ist, dass man hier eine normale Datenhaltung hat:
- Die Daten kommen dann aus irgend einer Quelle (z.B. einer Datei, Datenbank, Webservice, ....)
- Man hat eine Klasse (Entity oder Data Transfer Object (DTO) genannt), die einen Datensatz aufnehmen kann.
- Man hat eine (mindestens eine) Klasse die dann für das Laden / Speichern / Suchen und so verantwortlich ist (Repository oder Data Access Object (DAO) genannt). Hier dann kurz am Rande: Es gibt dann Frameworks / Libraries, die das extrem automatisieren. Es wird dann teilweise nur noch ein Interface geschrieben und die konkrete Implementation wird dann automatisch generiert ... Das kann also am Ende mit entsprechenden Libraries sehr einfach aussehen mit sehr wenig Aufwand.
Etwas in der Art ist bei Dir natürlich auch denkbar:
Du hast dann eine Klasse a.la. CategoryRepository mit getCategories() das einfach eine List<Category> zurück gibt.
(CategoryOverview würde es dann auch vermutlich nicht mehr geben... oder das wird dann diese Methode)
Und diese getCategories() könnte einfach eine Liste von Categories laden, z.B, aus einer Resource Datei. Also einfach per getClass().getResourceAsStream("/categories.txt") die Resource-Datei öffnen und dann Zeile für Zeile lesen. Für jede Zeile wird der Konstruktor aufgerufen und die Instanz kommt in eine ArrayList<Category>. Am Ende wird die Anzahl noch validiert (Also z.B. mind. 1 Category muss existieren und maximal die bestimmte Anzahl ...)
Dann hättest Du eine feste Anzahl an Kategorien die dann nicht verändert wird. (Also ähnlich wie das fixe Anlegen bei Dir im Code - nur eben vom Code separiert. Und Du hast eine zentrale Klasse mit der Logik, d.h. Du kannst in dieser Klasse jederzeit anpassen, woher die Daten kommen und Du kannst weitere Methoden hinzufügen und so ...)
Das wäre so ein Aufbau, wie er heutzutage das ist, was ich als "üblich" ansehen würde und das man immer wieder findet in diversen Varianten.
Eine weitere Idee könnte sein, dass man Category Instanzen so gar nicht anlegt. Statt dessen wird eine sogenannte Factory-Methode verwendet. Das könnte dann also sein, dass CategoryOverview eine createCategory Methode hat. Dann würde der Aufruf lauten:
Category food = categoryOveriew.createCategory("Nahrungsmittel");
Natürlich ist rein technisch auch ein anderer Aufbau denkbar. Das ist aber jetzt eine Lösungsidee, die ich explizit nicht empfehle sondern auch davon abrate!
So könnte die Klasse Category eine Klassenvariable haben:
private static final List<CategoryList> categories = new ArrayList<>();
Im Konstruktor kannst Du dann jede Instanz dort hinzufügen. Wenn die maximale Anzahl überschritten ist, kannst Du eine Exception werfen. Und die List kannst Du Dir dann natürlich auch über ein Getter oder so geben lassen.
Aber so static Elemente sollten - soweit möglich - vermieden werden.