Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
[JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Hm..ich lese da jetzt nix, dass es verboten sei andere Methoden zu schreiben. Und du musst setter schreiben, da wenn du einfach das Attribut auf public setzt, wäre das richtig schlechter Stil
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Für mich klang die Angabe so, als wäre nur das erlaubt, was angegeben ist?! Quasi "whitelisting" ...
Ok, von mir aus bastle ich Setter rein. Dass es der beste Weg wäre, musst du mir nicht sagen. Ich hab's eben wegen der Angabe nicht gemacht gehabt. Auf jeden Fall bräuchte ich dann bitte noch Hilfe beim Schreiben der SectionTest Klasse. Siehe hier.
Dann müsste ich aber statt fib() getKey() sagen und ich weiß nicht, ob ich da Parameter in den Methodenkopf einfügen darf/soll.
Zur dritten Fibonacci-Zahl käme ich dann wohl, wenn ich die Rekursion bei n=2 beginnen lassen würde?! Bzw. ist das das, was reset() machen sollte? Den Generator jedesmal auf die 3te Fibonacci-Zahl setzen? Dann müsste ich ja dort nur sagen return 2, aber das käme mir leicht "strange" vor ...
Und für KeyGenerator musste ich ja die crypto-Bibliothek einfügen, aber nutzen mir deren Methoden in dem Beispiel irgendwas?
- Das rot markierte passt auch noch nicht. Ich könnte ein neues Objekt der Klasse mit dem Klassennamen erstellen (FibonacciGenerator), aber laut Angabe soll ja eine KeyGenerator Instanz zurückgegeben werden?!
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Hi,
KeyGenerator ist ein Singleton du kannst kein neues Obj über new erstellen, du kannst dir aber ein Obj über getInstance holen.
Irgendwie versteh ich deine Aufgabenstellung nicht mir ist unklar was du mit der crypto-Bib machen sollst
Du kannst zwar der getInstance einen String algorithm
übergeben, aber da ist nichts von Fibonacci dabei.
Vll muss deine Klasse von KeyGenerator erben.
Ohne das crypto-Bib hätte ich jetzt gesagt:
du musst halt eine Statische Varialbe machen die dir die Rekursionstiefe speichert und bei jedem getKey() inkrementiert wird.
In getKey rufst du dann einfach fib(Rekursionstiefe) auf.
Und in reset setzt du die Rekursionstiefe auf 3.
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
^^ Hi! Danke für die Tipps.
Die crypto-Bibliothek habe ICH eingebunden, weil Eclipse sonst meint: KeyGenerator cannot be resolved to a type
In der Angabe steht eh nichts davon. Nur wie löse ich das sonst? Irgendwas will Eclipse ganz offenbar haben ...
Bei deiner restlichen Erklärung komme ich nicht ganz mit. Hast du dir das ganze ungefähr so vorgestellt (?):
Code:
public class FibonacciGenerator {
private static int rekursionstiefe;
[COLOR=royalblue]
/**
* Default-Konstruktor, der nicht außerhalb dieser Klasse
* aufgerufen werden kann
*/ private FibonacciGenerator() {
}
[COLOR=royalblue] /**
* Liefert die KeyGenerator-Instanz zurück
* @return KeyGenerator-Instanz
*/ static KeyGenerator getInstance() {
[COLOR=seagreen]/* geht ohne die crypto-Bibliothek so nicht! Und ein String als Parameter wird auch verlangt! [COLOR=seagreen]
BTW: Ist das hier nicht eine rekursive Endlosschleife? "Meine" Methode heißt ja gleich, wie die Java-Methode?! [COLOR=seagreen]*/ return KeyGenerator.getInstance();
}
[COLOR=royalblue] /**
* Fibonacci Berechnung
* @param num = Ausgabgswert
* @return Fibonacci-Zahl
*/ private long fib(long num) {
reset();
if (this.getKey() <= 1) {
return this.getKey();
} else {
return this.fib(this.getKey()-1) + this.fib(this.getKey()-2);
}
}
[COLOR=royalblue] /**
* Liefert einen (seit dem letzten Reset) eindeutigen Schlüssel
* @param l
* @return Schlüssel
*/ public long getKey() {
return this.fib(rekursionstiefe++);
}
[COLOR=royalblue] /**
* Setzt den Zahlengenerator zurück
*/ private void reset() {
rekursionstiefe = 3;
}
}
Irgendwie verstehe ich immer noch nicht ganz den Sinn von diesem ganzen Teil ... Ich soll mit dieser Klasse ein einziges Objekt erzeugen können, das dann den Schlüssel darstellt?! In der Aufgabe ist auch von Schlüsseln in der Mehrzahl die Rede, und ich dachte, Sinn vom Singleton Pattern wäre es, nur ein einziges Objekt, als einen einzigen Schlüssel, erzeugen zu können?!
[EDIT]
Kann es sein, dass die Methode getInstance() das Ergebnis von getKey() als Instanz zurückgeben soll?
Und was meinst du zu meinen Methoden-Modifikatoren? Passen die Sichtbarkeiten? Wenn der Satz darüber richtig ist, könnte ich ja getKey() auch auf private setzen. Und meine 3 Methoden außer der statischen getInstance() sind alles Instanzmethoden, die ich mit this aufrufen kann, oder?
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Ich hätte mir das ganze so vorgestellt.
Btw. Inkrement ist ++ nicht -- ^^
Du hast jetzt ein Singleton von FibonacciGenerator und über getKey bekommst du eine fortlaufende Fibonacci Zahl und mit reset wird wieder von vorne begonnen.
Das einzige Problem das ich sehe ist das in der Aufgabenstellung static KeyGenerator getInstance() steht, was meiner meinung nach total sinnfrei ist oder ich steh gerad irgendwie auf dem Schlauch
Code:
import javax.crypto.KeyGenerator;
public class FibonacciGenerator {
private static int rekursionstiefe = 3;
private static FibonacciGenerator instance = null;
/**
* Default-Konstruktor, der nicht außerhalb dieser Klasse aufgerufen werden
* kann
*/
private FibonacciGenerator() {
}
/**
* Liefert die KeyGenerator-Instanz zurück
*
* @return KeyGenerator-Instanz
*/
static FibonacciGenerator getInstance() {
if (instance == null) {
instance = new FibonacciGenerator();
}
return instance;
}
/**
* Fibonacci Berechnung
*
* @param num
* = Ausgabgswert
* @return Fibonacci-Zahl
*/
private static long fib(final int n) {
if (n <= 1) {
return n;
} else {
return fib(n - 1) + fib(n - 2);
}
}
/**
* Liefert einen (seit dem letzten Reset) eindeutigen Schlüssel
*
* @param l
* @return Schlüssel
*/
long getKey() {
return fib(rekursionstiefe++);
}
/**
* Setzt den Zahlengenerator zurück
*/
void reset() {
rekursionstiefe = 3;
}
}
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
^^ Habe oben noch fleißig rumeditiert, während du geschrieben hast. Ich glaube, dass mein Code jetzt sogar noch "besser" hinkäme, oder?
Dass getInstance() vom Typ KeyGenerator sein soll, ist bei mir auch das größte Problem. Das sollte doch der Klassenname sein?! Eben so, wie du's hier gemacht hast ...
[EDIT]
Also endgültig dann wohl so:
Code:
public class FibonacciGenerator {
private static int rekursionstiefe;
private static FibonacciGenerator instance = null;
[COLOR=royalblue]/**
* Default-Konstruktor, der nicht außerhalb dieser Klasse
* aufgerufen werden kann
*/ private FibonacciGenerator() {
}
[COLOR=royalblue]/**
* Liefert die KeyGenerator-Instanz zurück
* @return KeyGenerator-Instanz
*/ static FibonacciGenerator getInstance() {
if (instance == null) {
instance = new FibonacciGenerator();
}
return instance;
}
[COLOR=royalblue] /**
* Fibonacci Berechnung
* @param num = Ausgabgswert
* @return Fibonacci-Zahl
*/ private long fib(long num) {
this.reset();
if (this.getKey() <= 1) {
return this.getKey();
} else {
return this.fib(this.getKey()-1) + this.fib(this.getKey()-2);
}
}
[COLOR=royalblue]/**
* Liefert einen (seit dem letzten Reset) eindeutigen Schlüssel
* @param l
* @return Schlüssel
*/ public long getKey() {
return this.fib(rekursionstiefe++);
}
[COLOR=royalblue]/**
* Setzt den Zahlengenerator zurück
*/ private void reset() {
rekursionstiefe = 3;
}
}
Einfach mal davon ausgehen das die Aufgabenstellung Falsch ist
Das musst doch aber auch klatschen das ist ja indirekte-endlos-rekursion fib->getkey->fib->getkey ......
Code:
private long fib(long num) {
reset();
if (this.getKey() <= 1) {
return this.getKey();
} else {
return this.fib(this.getKey()-1) + this.fib(this.getKey()-2);
}
}
public long getKey() {
return this.fib(rekursionstiefe++);
Edit1: Ich würde jetzt einfach FibonacciGenerator von KeyGenerator erben lassen
Edit2: Wobei das geht gar nicht man ja keinen Super Konstruktor aufrufen.
Edit3: OK geht doch
Was genau willst du jetzt mit Vererbung machen? Ich habe mir gedacht, ich muss nur diese eine Klasse FibonacciGenerator machen und dazu dann noch eine JUnit TestKlasse, in der ich dann eigentlich verschiedene Schlüssel zurückbekommen müsste?!
BTW: Wie genau darf ich das mit dem Singleton-Ansatz aber mehreren Schlüsseln (als Instanzen) überhaupt verstehen? Siehe Sätze vorm EDIT hier.
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Habs bei mir mal schnell geschieben mit erben von KeyGenerator gehts .
Der Ansatz von nen Singleton ist du holst dir eine Instanze des Objekts mit getInstance und dann kannst du auf/mit diesem Objekt arbeiten, in diesem Beispiel jetzt also dir die Fib Zahlen (getKey) holen.
Bei Singleton darf es nur höhstens 1 Instanz einer Klasse geben.
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Das mit der Vererbung sieht interessant aus! Machen wir's besser so, dann müssen wir keine Methoden-Namen "mutwillig" ändern ...
Main soll ich keine machen, nur eine JUnit TestKlasse. Wenn ich in diese schreibe ...
Code:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class FibonacciGeneratorTest {
FibonacciGenerator key = (FibonacciGenerator) FibonacciGenerator.getInstance();
@Test
public void test() {
System.out.println(key.getKey());
System.out.println(key.getKey());
System.out.println(key.getKey());
System.out.println(key.getKey());
}
}
... dann bekomme ich als Ausgabe 0 2 2 2. Kann das stimmen? Kommt mir leicht "Spanisch" vor. Ich hätte mit allen möglichen verschiedenen Schlüsselwerten gerechnet. Oder liegt das jetzt daran, dass es immer die selbe Instanz ist?
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
eigentlich darf da nicht 0 2 2 2 kommen also wenn ich es bei mir mit main laufen lassen und noch ein paar mehr syso's mache sieht das so aus
2
3
5 -> Reset
2
3
5
8
13
An der Instanz darf es ja nicht liegen das MUSS ja immer die gleiche sein
Mach mal das
FibonacciGenerator key = (FibonacciGenerator) FibonacciGenerator.getInstance();
Entweder direkt in die Testmethode oder in die setUp() Methode.
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
^^ Ok, danke! Jetzt bekomme ich auch die ganzen Fibonacci-Zahlen raus.
Eine Frage noch: Du hast "alles" mit static Methoden gelöst, ich hab's ohne static Attribut und dafür mit this Aufruf gemacht. Soweit ich mich in Java auskenne, hast du also Klassen-Methoden gemacht und ich Instanz-Methoden?! Funktionieren tut scheinbar beides, aber was wäre jetzt der bessere Weg?
Und kannst mir bitte noch verraten, ob meine Methoden-Modifikatoren (für die Sichtbarkeit) stimmen? Code siehe voriges Posting. Nur vor void reset() darfst du dir ein public hindenken.
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
static KeyGenerator getInstance() das würde ich dann auch noch Public machen. default ist nicht so pralle
private static int recursionDepth; da kannst du auch das static weglassen
Ob man jetzt fib() static oder nicht static machst ist eigentlich egal. Ich habs halt static gemacht da diese Methode ja nicht von außen Sichtbar ist und eine Klassen Methode reicht.(Nen Paar Byte im Ram gespart )
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
^^ Ja, aber semantisch kann's ja nicht völlig egal sein, ob ich irgendwas zu einer statischen Klassen-Methode mache, oder eben eine Instanz-Methode mache?! In dem Beispiel kann ich es mir vielleicht aussuchen, aber immer geht das nicht?! Wovon hängt's ab? Das wäre noch interessant. Selbes auch bei Klassen- und Instanz-Variablen. Wann was nehmen?
----------
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Wenn du in einer Methode Attribute eines Objekts veränderst, dann kannst du das nur in normalen Methoden machen.
Wenn du aber in einer Methode Attribute einer Klasse(static Attribute) verändern willst oder gar nichts verändern willst dann machst du das in einer Klassen Methode.
Klassenvariablen definieren Globale Variablen, also für alle Objekte dieser Klasse steht das gleiche in dieser Variable. z.B. Datenbankverbindung, ObjectCounter
Instanz-Variablen sind die Eigenschaften von Objekten. Und jedes Objekt kann unterschiedliche Eigenschaften haben.
Ich hoffe das hat dir geholfen,sonst frag einfach, so jetzt man den anderen Thread anschauen
ah ne ist ja sogar der gleiche Thread ^^
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
Ok, habe jetzt noch das static bei int recursionDepth weggelöscht und dafür in den Methoden mit this aufgerufen, also als Instanzvariable, damit alles besser "zusammenpasst" (in meiner Version).
Das andere Beispiel ist eh im selben Thread, nur weiter vorne ...
[EDIT]
Hier nochmal der gesamte Code in aktuellster Form (damit du nicht alles zusammensuchen musst):
Member:
Code:
public class Member {
private final String firstName;
private final String lastName;
private final int ID;
private double income;
private double costs;
public Member(String firstName, String lastName, int ID) {
this.firstName = firstName;
this.lastName = lastName;
this.ID = ID;
this.income = this.getIncome();
this.costs = this.getCosts();
this.getSurplus();
}
public void setIncome(double income) {
this.income = income;
}
public double getIncome() {
return this.income;
}
public void setCosts(double costs) {
this.costs = costs;
}
public double getCosts() {
return this.costs;
}
public double getSurplus() {
return this.getIncome()-this.getCosts();
}
public String toString() {
String result = new String();
result = "Name: " + this.firstName + " " + this.lastName + " | Income: " + this.getIncome() + " | Costs: " + this.getCosts() + " | Surplus: " + this.getSurplus();
return result;
}
}
SupportMember:
Code:
public class SupportMember extends Member {
public SupportMember(String firstName, String lastName, int ID) {
super(firstName, lastName, ID);
this.setIncome(100);
this.setCosts(15);
}
}
ActiveMember:
Code:
public class ActiveMember extends Member {
public int activity;
public ActiveMember(String firstName, String lastName, int ID, int activity) {
super(firstName, lastName, ID);
if (this.activity < 0 || this.activity > 10) { // falls ungültige Aktivität angegeben wird
this.activity = 0;
} else {
this.activity = activity;
}
}
}
TopAthlete
Code:
public class TopAthlete extends ActiveMember {
public TopAthlete(String firstName, String lastName, int ID, int activity) {
super(firstName, lastName, ID, activity);
this.setIncome(120);
this.setCosts(this.activity * 10);
}
}
AmateurAthlete
Code:
public class AmateurAthlete extends ActiveMember {
public AmateurAthlete(String firstName, String lastName, int ID, int activity) {
super(firstName, lastName, ID, activity);
this.setIncome(300);
this.setCosts(this.activity * 1.5);
}
}
Trainer
Code:
public class Trainer extends ActiveMember {
public Trainer(String firstName, String lastName, int ID, int activity) {
super(firstName, lastName, ID, activity);
this.setIncome(120);
this.setCosts(this.activity * 50);
}
}
ChairMember
Code:
public class ChairMember extends Member {
private int expertise;
public ChairMember(String firstName, String lastName, int ID, int expertise) {
super(firstName, lastName, ID);
if (this.expertise < 0 || this.expertise > 10) {
this.expertise = 0;
} else {
this.expertise = expertise;
}
this.setIncome(this.expertise * 100);
this.setCosts((this.getIncome() * 20) / 100);
}
}
Section
Code:
import java.util.ArrayList;
public class Section extends Member {
private final int size; // Größe des Sektions-Arrays
private int allocation; // aktuelle Belegung mit Mitgliedern
private Member[] section;
private double overallIncome;
private double overallCosts;
private ArrayList<Section> sections;
public Section(String firstName, String lastName, int ID, int size) {
super(firstName, lastName, ID);
this.size = size;
this.allocation = 0;
this.section = new Member[this.size];
for (int i = 0; i < section.length; i++) {
this.overallIncome += this.section[i].getIncome();
this.overallCosts += this.section[i].getCosts();
}
this.sections = new ArrayList<Section>();
}
public void addMember(Member m) {
if (this.allocation < this.size) {
this.section[this.allocation] = m;
this.allocation++;
} else {
System.out.println("Member can't be added! Section already full.");
}
}
public void AddSection(Section section) {
if (this.allocation < this.size) {
this.sections.add(section);
this.allocation++;
} else {
System.out.println("Sub-Section can't be added! Section already full.");
}
}
}
MemberTest
Code:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class MemberTest {
Member one = new Member("Hans", "Mueller", 12); // 12 = ID
@Test
public void test() {
String testString = "Name: Hans Mueller | Income: 0.0 | Costs: 0.0 | Surplus: 0.0";
assertEquals(true, testString.equals(one.toString()));
}
}
SupportMemberTest
Code:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class SupportMemberTest {
SupportMember supportOne = new SupportMember("Hans", "Mueller", 12);
@Test
public void test() {
String testString = "Name: Hans Mueller | Income: 100.0 | Costs: 15.0 | Surplus: 85.0";
assertEquals(true, testString.equals(supportOne.toString()));
}
}
ActiveMemberTest
Code:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class ActiveMemberTest {
ActiveMember activeOne = new ActiveMember("Hans", "Meier", 14, 8); // 14 = ID, 8 = Aktivität
@Test
public void test() {
String testString = "Name: Hans Meier | Income: 0.0 | Costs: 0.0 | Surplus: 0.0";
assertEquals(true, testString.equals(activeOne.toString()));
}
}
TopAthleteTest
Code:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class TopAthleteTest {
TopAthlete topAthleteOne = new TopAthlete("Franz", "Berger", 43, 4); // 43 = ID, 4 = Aktivität
@Test
public void test() {
String testString = "Name: Franz Berger | Income: 120.0 | Costs: 40.0 | Surplus: 80.0";
assertEquals(true, testString.equals(topAthleteOne.toString()));
}
}
AW: [JAVA] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...
na das mit static musste doch nu wissen ^^ da haben wir doch dieses voll ätzende bsp da durchgenommen, wo wir 0 plan hatt (wie so oft ^^). nochmal zur verdeutlichung:
static methoden: du brauchst keine objekt-instanz (myClass myObj = new myClass() der klasse anlegen, um auf die methode zuzugreifen, sondern du greifst über den klassennamen ganz allgemein darauf zu (statt myObj.methode(); eben myClass.methode(). bsp: bestes beispiel dafür sind so math-klassen - von denen musst du auch kein objekt anlegen -> math.abs(var); für den absolutwert einer variablen (und nicht math mathObj = new math(); mathObj.abs(var).
static variablen: gelten objektübergreifend, wie phoenix ja schon schön "be-beispielt" hat ^^ du hast 2 objekte der selben klasse, in obj1 erhält die staticVar den wert 1, in obj2 darauf allerdings den wert 2. greift man nun über obj1 auf staticVar zu, so bekommt man die von ob2 gesetzte 2 ausgegeben.