Instanz einer anderen Klasse zurückgeben

Individuum

Mitglied
Servus,

ich habe dass Problem dass ich eine Instanz zurückgeben will aus einer anderen Klasse. Hier im Beispiel will ich aus der Klasse Service 01:


Java:
public class Service01 {

    private final String Name; // Getter und Setter brauch ich, da alle Attribute private sind!
    private final int yPosition;
    final int xPosition;
    private final double Sendeleistung;
    private final double Frequenz;

    // Mögliche Senderfrequenzen

    public static final double FREQUENCY_WIFI = 2.4;
    public static final double FREQUENCY_LTE = 2.6; //Wenn LTE wahr ist
    public static final double FREQUENCY_E = 0.9;

    public Service01(String NameK, int yPositionK, int xPositionK) { // K für Konstruktor

        this.Name = NameK;
        this.yPosition = yPositionK;
        this.xPosition = xPositionK;
        this.Sendeleistung = 0.3;
        this.Frequenz = FREQUENCY_WIFI;
    }

    public Service01(int xPositionK, int yPositionK, boolean LTE) { // K für Konstruktor

        this.xPosition = xPositionK;
        this.yPosition = yPositionK;

        if (LTE == true) {

            this.Name = "LTE";
            this.Sendeleistung = 8000;
            this.Frequenz = FREQUENCY_LTE;

        }

        else {

            this.Name = "E";
            this.Sendeleistung = 18000;
            this.Frequenz = FREQUENCY_E;

        }

    }

    public String getName() { // S für Setter

        return this.Name; // Wie funktioniert Setter bei Konstanten?
    }

    public int getYPosition() {

        return this.yPosition;

    }

    public int getXPosition() {

        return this.xPosition;

    }

    public double getSendeleistung() { // Wir brauchen Getter, da wir durch unser aufschreiben schon "setten"

        return this.Sendeleistung;

    }

    public double getFrequenz() {

        return this.Frequenz;
    }

}

Zurückgegeben werden soll die verwaltete Service Instanz, welche auf der übergebenen Frequenz sendet und an den gegebenen Koordinaten über stärkstes SRX (aus Methode compute Intensity) verfügt.

Wie kann ich dies zurückgeben in meiner getStrongestNetwork Methode der Klasse Connection?


Java:
public class Connection {

    private static Service01[] Internetquellen = new Service01[100]; // Lege Array an mit 100 freien Stellen

    public static boolean add(Service01 s) {

        for (int i = 0; i < Internetquellen.length; i++) {

            if (Internetquellen[i] == null) {

                Internetquellen[i] = s;

                if (Internetquellen[i] == s) {

                    return true;
                }

                break;
            }

        }

        return false;

    }

    public static double computeIntensity(int x, int y, Service01 s) {
        double SRX = 0;
        if (s != null) {

            int x_1 = (s.getXPosition() - x) * (s.getXPosition() - x);
            int y_1 = (s.getYPosition() - y) * (s.getYPosition() - y);

            double d = Math.sqrt(x_1 + y_1);

            SRX = s.getSendeleistung() * Math.pow(4 * 3.14 * d * s.getFrequenz(), 2);

        }
        return SRX; // Warum brauch ich return?

    }

    public static void printAvalibleNetworks(int x, int y) {

        for (int i = 0; i < Internetquellen.length; i++) {

            if (Connection.computeIntensity(x, y, Internetquellen[i]) > 1) {
                System.out.println(Internetquellen[i].getName());
            }
        }

    }
   
    public static void getStrongestNetwork (int x, int y, double f) { 
       
        
       
    }

}
 
Zuletzt bearbeitet von einem Moderator:
Java:
import static java.lang.Double.compare;
import static java.util.Arrays.stream;
import java.util.Objects;
...
public static Service01 getStrongestNetwork(int x, int y, double f) {
  return stream(Internetquellen)
    .filter(Objects::nonNull)
    .filter(s -> s.getFrequenz() == f) // <- vielleicht besser mit epsilon?
    .sorted((s1, s2) -> compare(computeIntensity(x, y, s2), computeIntensity(x, y, s1)))
    .findFirst()
    .orElse(null);
}
 
Zuletzt bearbeitet:
Java:
public static Service01 getStrongestNetwork(int x, int y, double f) {
  return java.util.Arrays.stream(Internetquellen)
    .filter(java.util.Objects::nonNull)
    .filter(s -> s.getFrequenz() == f) // <- vielleicht besser mit epsilon?
    .sorted((s1, s2) -> Double.compare(computeIntensity(x, y, s2), computeIntensity(x, y, s1)))
    .findFirst()
    .orElse(null);
}

Ich erwarte schon von dir etwas Transferleistung, dass du weißt, dass import Statements an den Anfang der Compilation Unit kommen und die gezeigte Methode dann entsprechend in die Connection Klasse. Aber bitte.
 
ich verstehe von dem was du schreibst echt wenig, ich bin ganz am Anfang. Ich wuerde es eher in der Form verstehen wie ich meine Methoden davor geschrieben habe. Das problem ist halt dass ich nicht weiss wie ich das Service Objekt zurück gebe
 
Mein Objekt Service habe ich ja mit meinen eigenschafften wie Position etc versehen in der Service Klasse. Wie kann ich diese eigenschaften aber wieder ausgeben?
 
Das problem ist halt dass ich nicht weiss wie ich das Service Objekt zurück gebe
Du brauchst erstmal an der Methode einen Rückgabetyp. Siehe das `Service01` in meiner Methode direkt hinter dem `public static`. Das sagt Java, dass diese Methode einen Wert an den Aufrufer von eben genau diesem Typ zurückliefern wird. So wie etwa deine `computeIntensity` Methode das bereits mit `double` tut.
Dann brauchst du in der Methode ein `return` Statement.
 
Java:
return dasServiceObjekt;

Und `dasServiceObjekt` ist eine Variable, die eben das Service01 Objekt enthält, welches du mit einer Schleife über die Internetquellen berechnet hast, welches dann das mit der größten Sendeleistung ist.
Das Rüstzeug dafür hast du bereits in diversen anderen Methode angewandt: for-Schleifen sowie Zugriffe auf Eigenschaften eines Service01-Objektes in `printAvalibleNetworks`.
 
Der Vollständigkeit halber, sein Code mal formatiert:
Java:
public class Service01 {
    private final String Name; // Getter und Setter brauch ich, da alle Attribute private sind!
    private final int yPosition;
    final int xPosition;
    private final double Sendeleistung;
    private final double Frequenz;

    // Mögliche Senderfrequenzen

    public static final double FREQUENCY_WIFI = 2.4;
    public static final double FREQUENCY_LTE = 2.6; // Wenn LTE wahr ist
    public static final double FREQUENCY_E = 0.9;

    public Service01(String NameK, int yPositionK, int xPositionK) { // K für Konstruktor
        this.Name = NameK;
        this.yPosition = yPositionK;
        this.xPosition = xPositionK;
        this.Sendeleistung = 0.3;
        this.Frequenz = FREQUENCY_WIFI;
    }

    public Service01(int xPositionK, int yPositionK, boolean LTE) { // K für Konstruktor
        this.xPosition = xPositionK;
        this.yPosition = yPositionK;

        if (LTE == true) {
            this.Name = "LTE";
            this.Sendeleistung = 8000;
            this.Frequenz = FREQUENCY_LTE;
        } else {
            this.Name = "E";
            this.Sendeleistung = 18000;
            this.Frequenz = FREQUENCY_E;
        }
    }

    public String getName() { // S für Setter
        return this.Name; // Wie funktioniert Setter bei Konstanten?
    }

    public int getYPosition() {
        return this.yPosition;
    }

    public int getXPosition() {
        return this.xPosition;
    }

    public double getSendeleistung() { // Wir brauchen Getter, da wir durch unser aufschreiben schon "setten"
        return this.Sendeleistung;
    }

    public double getFrequenz() {
        return this.Frequenz;
    }
}

und
Java:
public class Connection {

    private static Service01[] Internetquellen = new Service01[100]; // Lege Array an mit 100 freien Stellen

    public static boolean add(Service01 s) {
        for (int i = 0; i < Internetquellen.length; i++) {
            if (Internetquellen[i] == null) {
                Internetquellen[i] = s;
                if (Internetquellen[i] == s) {
                    return true;
                }
                break;
            }
        }
        return false;
    }

    public static double computeIntensity(int x, int y, Service01 s) {
        double SRX = 0;
        if (s != null) {
            int x_1 = (s.getXPosition() - x) * (s.getXPosition() - x);
            int y_1 = (s.getYPosition() - y) * (s.getYPosition() - y);
            double d = Math.sqrt(x_1 + y_1);
            SRX = s.getSendeleistung() * Math.pow(4 * 3.14 * d * s.getFrequenz(), 2);
        }
        return SRX; // Warum brauch ich return?
    }

    public static void printAvalibleNetworks(int x, int y) {
        for (int i = 0; i < Internetquellen.length; i++) {
            if (Connection.computeIntensity(x, y, Internetquellen[i]) > 1) {
                System.out.println(Internetquellen.getName());
            }
        }
   }

    public static void getStrongestNetwork(int x, int y, double f) {

    }
}
 
Im Endeffekt will ich eine Methode machen der man eine Position (x und y) und Frequenz übergibt, welche das Objekt der Klasse Service? ausgibt, welches das größte SRX hat (in computeIntensity) definiert.
 
Ich verstehe schon, was du willst, nur frage ich mich, warum du es nicht schaffst, bzw. wo eigentlich die Verständnisschwierigkeiten sind, wenn man sich daneben die Methoden anguckt, die du ja schon implementiert hast.
 
Dann formulier doch mal eine konkrete/spezifische Frage. "Ich weiß nicht, wie ich die Service01 Instanz zurückgebe" ist keine spezifische Frage, bzw. eine, die man mit `return dieServiceInstanz;` beantwortet.
Ich habe dir bereits eine funktionierende Lösung gegeben, die du ja nicht wolltest. Stattdessen forderst du jetzt implizit eine Lösung, die auf for-Schleifen basiert. Das solltest du aber selber hinkriegen. Falls es da konkrete/spezifische Verständnisprobleme zu spezifischen Java-Sprachkonstrukten gibt, darfst du gerne dazu fragen. Aber einfach fragen "Ich weiß nicht wie das geht" ist keine Frage (zumal es ja auch eine Aussage ist), auf die man eine Antwort geben könnte, außer eben eine andere fertige Lösung mit for-Schleifen. Da bin ich aber raus.
 
Java:
for (int i = 0; i < Internetquellen.length; i++) { //Laeuft solange wie das array ist und schaut sich jede Stelle an
          
            if (Connection.computeIntensity(x, y, Internetquellen [i]) <= 1) {
               
                return null;
               
            }

durch diese for schleife schaue ich doch ob der Wert von ComputeIntensity an der Stelle i des Arrays kleiner oder gleich null ist
 
Zuletzt bearbeitet von einem Moderator:
Kannst Du Deinen Code mal zwischen Code-Tags packen? Einfach [CODE=Java]Dein Code[/CODE] Ansonsten ist das nicht lesbar, außerdem werden Teile des Codes durch Formatierungen ersetzt.
 
Kannst du mir deinen Code erklären?
Mal als Kommentare:
Java:
public static Service01 getStrongestNetwork(int x, int y, double f) {
  return java.util.Arrays.stream(Internetquellen)   // erzeuge einen Stream aus Internetquellen
    .filter(java.util.Objects::nonNull)  // filtere alle null-Referenzen heraus
    .filter(s -> s.getFrequenz() == f) // betrachte nur die Service01-Instanzen mit der Frequenz f
    .sorted((s1, s2) -> Double.compare(computeIntensity(x, y, s2), computeIntensity(x, y, s1))) // sortiere den Spaß absteigend nach Intensität
    .findFirst()  // gib das erste Ergebnis zurück, falls vorhanden
    .orElse(null); // oder null, falls nicht.
}
 
Java:
    public static Service01 getStrongestNetwork(int xPosition, int yPosition, double Frequenz) {

        double strongestSRX = 0;
        Service01 strongestService = null;

        for (int i = 0; i < Internetquellen.length; i++) {

            if (Internetquellen[i] != null && Math.abs(Frequenz - Internetquellen[i].getFrequenz()) < 0.000001);
               
            {

                if (Connection.computeIntensity(xPosition, yPosition, Internetquellen[i]) > strongestSRX) {

                    strongestSRX = Connection.computeIntensity(xPosition, yPosition, Internetquellen[i]);
                    {

                        strongestService = Internetquellen[i];
                    }
                }
            }
            if (strongestSRX > 1) {

                return strongestService;

            } else {

                return null;
            }

        }
   

    }
 
Warum das?:
Java:
if (strongestSRX > 1) {
  return strongestService;
} else {
  return null;
}
Und ernsthaft: Drück mal Strg+Shift+F in Eclipse und entferne die ganzen Leerzeilen.
Danach wirst du auch erkennen, dass deine if-Anweisung mit einem Semikolon abschließt:
Java:
if (Internetquellen[i] != null && Math.abs(Frequenz - Internetquellen[i].getFrequenz()) < 0.000001)
        ; // <- sicherlich nicht, was du willst
 
Auch die obligatorische Bitte: halte die Java-Konventionen zur Schreibweise von Bezeichnern ein. Typbezeichner wie z. B. Klassennamen in UpperCamelCase, Variablen-, Parameter-, Methodennamen in lowerCamelCase.

Die for-Schleife kannst Du durch eine for-each-Schleife ersetzen.

Insgesamt sähe es dann so aus:
Java:
public static Service01 getStrongestNetwork(int xPosition, int yPosition, double freq) {
    double strongestSRX = 0;
    Service01 strongestService = null;

    for (Service01 service : internetquellen) {
        if (service != null && Math.abs(freq - service.getFrequenz()) < 0.000001) {
            double srx = Connection.computeIntensity(xPosition, yPosition, service);
            if (srx > strongestSRX) {
                strongestSRX = srx;
                strongestService = service;
            }
        }
    }

    return strongestSRX > 1 ? strongestService : null;
}
 
Noch eine Stream-Lösung mit der Einschränkung, dass nur solche Service01 Instanzen berücksichtigt werden sollen, deren Intensität > 1 ist:
Java:
public static Service01 getStrongestNetwork(int x, int y, double f) {
  return java.util.Arrays.stream(Internetquellen)
    .filter(java.util.Objects::nonNull)
    .filter(s -> s.getFrequenz() == f)
    .map(s -> new Object() {
      double intnst = computeIntensity(x, y, s);
      Service01 srv = s;
     })
    .filter(o -> o.intnst > 1)
    .sorted((o1, o2) -> Double.compare(o2.intnst, o1.intnst))
    .findFirst()
    .map(o -> o.srv)
    .orElse(null);
}
Meine Empfehlung hier: Modelliere die Frequenz nicht direkt als double, sondern als Enum mit deinen drei Ausprägungen. Insbesondere für die getStrongestNetwork() Methode willst du ja keine Arithmetik durchführen oder eine ordinale oder kardinale Skala der Frequenzen haben, sondern lediglich eine nominale Unterscheidung zwischen den drei Möglichkeiten. Somit könnte deine Frequenz dann so aussehen:
Java:
public enum Frequenz {
  WIFI(2.4), LTE(2.6), E(0.9);
  private final double frequenz;
  private Frequenz(double frequenz) {
    this.frequenz = frequenz;
  }
  public double getFrequenz() {
    return frequenz;
  }
}
und die Signatur von deiner getStrongestNetwork() Methode dann so:
Java:
public static Service01 getStrongestNetwork(int x, int y, Frequenz f)
und dann nur noch einen Vergleich zwischen Enum-Literalen machen, statt einen Vergleich zwischen double-Werten.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben