Methoden Wo mache ich die Main Methode hin, wenn ich keine statics habe?

ChaosLauch

Mitglied
Hallo Ihr Lieben,

für meine Bauinformatik-Arbeit soll ich eine kleine Methode entwickeln, damit bei einem Haus ermittelt werden kann, wie viele Fenster und Türen es hat (wobei mir das UML vorgegeben ist). Die Klasse Opening vererbt die Variablen Height und Width an die Klassen Door und Window
Da es allg. modellierbar sein soll, habe ich für die Türen und Fenster ArrayList erstellt.
Mein Problem ist nun:
Ich möchte gerne meine Zwischenergebnisse überprüfen, indem ich mir sagen lasse, wie viele Türen und Fenster nun das Gebäude denn hat. Da die Größe der Array List nicht Static sind, würden diese Protestieren, wenn ich sie unter der Main-Methode laufen lassen würde. Allerdings muss ja die Main Methode irgendwo hin, damit das Programm läuft. Wo in diesem Quellcode sollte ich sie reinbasteln?

Sorry, falls das jetzt eine mega triviale Frage sein sollte, ich bin noch ganz frisch.
Danke schonmal im Vorraus.

Javascript:
package aufg4;

import java.util.ArrayList;

    public class Opening{
    
        protected double width;
        protected double height;
        protected double flaeche;
        
        public double getWidth() {
            return width;
        }
        public double getHeight() {
            return height;
        }
        public double getFlaeche() {
            return flaeche;
        }
        
        public Opening(double width, double height){
            this.width = width;
            this.height = height;
        }
        
        private  ArrayList<Window> fenster = new ArrayList<Window>();
        private  ArrayList<Door> tueren = new ArrayList<Door>();
        
        public ArrayList<Window> getWindow() {
            return fenster;   
        }
        public void addWindow(Window window) {
            fenster.add(window);
        }
            
        public ArrayList<Door> getDoor() {
            return tueren;
        }
        public void addDoor(Door door) {
            tueren.add(door);
        }
        
        final int anzahlFenster=fenster.size();
        final int anzahlTueren=tueren.size();
        final int oeffnungen =anzahlFenster+anzahlTueren;
        
        public void ausgabe() {
        System.out.println("Das Haus hat " + oeffnungen + "Oeffnungen.");
        }
        
}
 

mihe7

Top Contributor
Da die Größe der Array List nicht Static sind, würden diese Protestieren, wenn ich sie unter der Main-Methode laufen lassen würde. Allerdings muss ja die Main Methode irgendwo hin, damit das Programm läuft. Wo in diesem Quellcode sollte ich sie reinbasteln?
Was ist kaputt?!?

Du brauchst doch in Deine Klasse nur eine main-Methode aufnehmen:
Java:
public static void main(String[] args) {
    Opening opening = new Opening();
    opening.ausgabe();
}

Abgesehen davon geben Deine final-Variablen keinen Sinn.
 

MoxxiManagarm

Top Contributor
Abgesehen davon geben Deine final-Variablen keinen Sinn.

Ehrlich gesagt macht für mich noch viel mehr keinen Sinn.

1) Wieso hast du eine Breite, eine Höhe UND eine Fläche? Du brauchst die Fläche als Instanzvariable nicht. Du kannst aber trotzdem den Supplier für die Fläche haben.

Java:
public double getFlaeche() {
            return width * height;
        }

2) Bitte entscheide dich für eine Sprache bei Benennungen. Du hast mal Deutsch (flaeche, fenster, tueren...) und mal Englisch (Opening, Door, Window...).

3) Die Klasse Opening zu nennen für dieses Beispiel finde ich persönlich echt grausam (sorry). Wenn ich Opening lese stelle ich mir eine Aussparung in der Wand vor, also ein Loch wo ein Tür, eine Fenster oder sowas reinkommt. Wäre nicht House, Building, Wall o.Ä. besser?

4) Eine solche Mischung der Reihenfolge der Methoden und Instanzvariablen ist nicht sehr leserlich. I.d.R. werden Instanzvariablen am Anfang der Klasse geführt.

5) Ich gehe davon aus, dass die Klassen für Window und Door auch eine Position+Größe kennen. Wäre es nicht sinnvoll bei addWindow und addDoor ein gewisses Maß an Fehlerhandling zu ergänzen, sodass kein Fenster eingefügt werden kann, welches sich überschneidet oder vielleicht einen gewissen Mindestabstand unterschreitet?
 

LimDul

Top Contributor
Du brauchst doch in Deine Klasse nur eine main-Methode aufnehmen:
Java:
public static void main(String[] args) {
    Opening opening = new Opening();
    opening.ausgabe();
}

Ich hab mir bei sowas auch angewöhnt diesen Code in eine extra Klasse zu packen ala TestMain oder so. Da ist dann quasi nur die Main-Methode drin. Einfach aus dem Grund, dass ich meinen "produktiven" Code nicht mit irgendwelchen Dummy-Main Methoden verschandeln muss um Dinge zu testen. Da nehme ich mir die Freiheit in dieser Klasse auch Dinge zu tun, die ich in echtem Code nicht haben würde (auskommentierter Code, unused Warnings - weil manche Variablen nur von aktuell auskommentierten Code gebraucht werden etc.)

Was aber in den Beispiel sich eigentlich viel mehr anbietet als eine Main-Methode wären Unit-Tests. Denn die Main-Methode wird ja nur benötigt um für ein paar Daten zu schauen ob am Ende die richtige Ausgabe / die richtigen Werte rauskommen. Und genau dafür sind eigentlich Unit-Tests das Mittel der Wahl.
 

temi

Top Contributor
Die Klasse Opening zu nennen für dieses Beispiel finde ich persönlich echt grausam (sorry). Wenn ich Opening lese stelle ich mir eine Aussparung in der Wand vor, also ein Loch wo ein Tür, eine Fenster oder sowas reinkommt. Wäre nicht House, Building, Wall o.Ä. besser?

Ich interpretiere die Aufgabe so, dass Opening eine allgemeine Öffnung (worin auch immer) ist. Davon erben die speziellen Öffnungen Window und Door.

Insofern hat eine Arraylist für Fenster und Türen in einer Klasse für Öffnungen gar nichts verloren. Fenster und Türen gibt es in Wänden oder im Haus also so in der Art:
Java:
class House {
   
    private List<Opening> openings = new ArrayList<>();
   
    // Über diese Methode kann man dem Haus Fenster und Türen hinzufügen
    public void addOpening(final Opening opening) {
        this.openings.add(opening);
    }
   
    //...
}

Und was die main() angeht; da stimme ich @LimDul voll und ganz zu.
 

ChaosLauch

Mitglied
Danke für den Super Tipp, richtig funktionieren tut es noch nicht, aber ich bin ja auch eine Anfängerin. Der Unit-Test wurde kein einziges Mal während der Vorlesung, im Skript und in der Übung erwähnt
 
X

Xyz1

Gast
Bis auf "Building" sind doch alles deutsche Begriffe... den Denglisch Vorwurf kann man hier nicht anbringen.
 

MoxxiManagarm

Top Contributor
In dem uml sie man aber schön, dass Door und Window mit einer leeren dreiecksspitze zu opening zeigen. Das ist der Pfeil für Vererbung, d.h. Door IST ein Opening, Window IST ein Opening. Ein Mauerwerksstand HAT 0 bis n solcher Openings. Opening ist nicht abstract. Es muss also nicht eine Tür oder Fenster sein. Du kannst also blöd gesagt auch einfach ein Loch in der Wand haben.
 
Zuletzt bearbeitet:

ChaosLauch

Mitglied
Zu Punkt 1)
Die Fläche brauche ich später für die Weiterführung der Methode. Dies ist nur eine unteraufgabe, am Ende soll ich das Betonvolumen, dass ich für das Haus brauche errechnen.

zu Punkt 2) Das ist nicht meine Schuld >.< Diese unglaublich hässliche Benennung hat mein Prof zu verantworten, der das UML in Denglisch erstellt hat...

Zu Punkt 5) Ich amche nicht mehr, was die Aufgabe von mir verlangt ^^ Eigentlich könnte man das ganze auch in CAD Architectures zeichnen, wenn man pragmatisch wäre. Die Position von fenstern und Türen ist tatsächlich für das Pogramm, was am Ende die Menge an Beton ausgeben soll nicht entscheidend. Aber ich gebe dir natürlich Recht, dass das viel schöner und sinnvoller wäre.
 

ChaosLauch

Mitglied
In dem uml sie man aber schön, dass Door und Window mit einer leeren dreiecksspitze zu opening zeigen. Das ist der Pfeil für Vererbung, d.h. Door IST ein Opening, Window IST ein Opening
Die Vererbung steht doch in der erbenden Klasse oder?
Code:
package aufg4;


public class Door extends Opening {
private  String description;

public Door(double width,double height,String description)
{
super(width, height);
this.description = description;

}

       
    public String getDescription() {
    return description;
    }
    public void setDescription(String description) {
    this.description = description;
    }

    Door t0 = new Door(1.76, 2.26, "Haustuer");
    Door t1 = new Door(1.03, 2.26, "Kuechentuer");
    Door t2 = new Door(1.13, 2.26, "Wohnzimmertuer");
    Door t3 = new Door(1.03, 2.26, "Schlafzimmertuer");
    Door t4 = new Door(0.885, 2.26, "Badezimmertuer");
    Door t5 = new Door(2.42, 2.26, "Terassentuer");
}

Hier als Beispiel die Klasse für Door. Da ist doch die Vererbung durch den extends Befehl gegeben oder täusche ich mich da? Würde die Vererbung nicht klappen würde sich ja zudem in der Klasse der Openings überhaupt nichts tun.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Vererbung steht doch in der erbenden Klasse oder?
[...]
Hier als Beispiel die Klasse für Door. Da ist doch die Vererbung durch den extends Befehl gegeben oder täusche ich mich da?
Nein, das stimmt soweit :)

In deinem Code oben hast du allerdings in Opening eine ArrayList<Window> fenster und eine ArrayList<Door> tueren, die haben nicht mit der Vererbung zu tun und sind auch nicht nötig :)
 

MoxxiManagarm

Top Contributor
Du musst noch aufpassen mit deinem Package Namen. Aktuell benennst du es aufg4. Der Name ist dir aber auch vorgegeben. Ich hoffe das ist dir bewusst.
 

ChaosLauch

Mitglied
Du musst noch aufpassen mit deinem Package Namen. Aktuell benennst du es aufg4. Der Name ist dir aber auch vorgegeben. Ich hoffe das ist dir bewusst.

Klar, das ist ja mein mini-Testprogramm der Ecke unten rechts. Die Aufg4 ist es wie oben beschrieben die Anzahl der Öffnungen zu bestimmen. Ich wollte nur in einem seperaten Javaprojekt gucken, ob der Quelltext funktioniert ^^
 

Neue Themen


Oben