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 ein alternativer Browser verwenden.
public class Screen {
public Screen(){
};
public class Size {
public Size() {
CheckResolution();
};
public int getHeight() {
return x;
}
public int getWidth() {
return y;
}
}
scheint mir wohl eher ein static - noch-static Problem zu sein:
Du kannst nicht per classenname eine Funktionaufrufen, die nicht-static ist, dazu musst du die Instanzvariable benutzen. Weiss aber gerade nicht, wie man das mit inneren Klassen machen kann, vllt. musst du da dann auch noch eine Instanz erzeugen oder so, bin mir da auch nicht ganz sicher.
Du kannst nicht per classenname eine Funktionaufrufen, die nicht-static ist, dazu musst du die Instanzvariable benutzen. Weiss aber gerade nicht, wie man das mit inneren Klassen machen kann, vllt. musst du da dann auch noch eine Instanz erzeugen oder so, bin mir da auch nicht ganz sicher.
Das ist genau das, was ich mit meinem Beispiel gemacht habe: da man bei inner-classes keine statischen Methoden deklarieren kann, muss man eine Instanz erzeugen. Das kann z.B. im Konstruktor von Screen passieren, wenn man - wie ursprünglich gepostet - die Größeninformation von einer Screen-Instanz erfragen will. Wenn man nicht mit Screen-Instanzen hantieren will, kann man in Screen natürlich auch eine statische Methode verwenden:
Code:
public class Screen {
public class Size() {
/* ... */
}
public static getSize() {
return new Size();
}
}
Dann kann man das ohne die Screen-Instanz verwenden:
Code:
int w = Screen.getSize().getWidth();
Unschön ist jetzt, dass, wenn man z.B. nacheinander Höhe und Breite abfragen will, zwei Size-Objekte erzeugt werden. Abhilfe:
Code:
public class Screen {
public class Size() {
/* ... */
}
private static Size sizeSingleton;
public static getSize() {
if ( sizeSingleton == null) sizeSingleton = new Size();
return sizeSingleton;
}
}
Also gegen static hab ich eine Allergie, versuch es mal so:
(Oder wie man so schoen sagt, static ist boese!)
Code:
public class Screen {
public Size s;
public Screen() {
s = new Size();
}
public class Size() {
/* ... */
}
}
}
//und dann kannst du so aus einer anderen Klasse draufzugreifen:
Screen myScreen = new Screen();
myScreen.s.beliebigeExistierendeMethode();
Achte darauf, dass die Instanz von Size in Screen public sein muss. Auch die Methoden und Variablen, die du aufrufen bzw. veraendern willst, muessen natuerlich public sein.
Joa stimmt schon....aber wenn man eine setMethode dazusetzt ist es auch wieder egal...mir ist hier sowieso nicht klar, warum das eine innere Klasse sein muss, aber das haengt sicherlich mit dem Rest des Programmes zusammen.
Das ist doch etwas pauschal. Es gibt durchaus Gründe dafür, Methoden oder Member static zu machen; bewährte Design-Patterns wie Singleton oder Abstract Factory wären sonst nicht oder nur auf Umwegen zu realisieren. Außerdem ist die Erzeugung von Objekten aus Performance- und Memory-Sicht eine kostspielige Angelegenheit, die man mit static-Methoden manchmal vermeiden kann. Es stimmt natürlich, dass man sich in jedem Einzelfall überlegen muss, ob static wirklich angebracht ist.
Dabei würde ich mir immer zwei Fragen stellen:
1. Worin besteht der Nutzen der Verwendung statischer Elemente?
2. Erkauft man sich damit irgendwelche Einschränkungen?
Im konkrekten Fall:
1. Das Auslesen der Bildschirmgröße (checkResolution() im Size-Konstruktor) ist vermutlich eine nicht ganz triviale und daher "teure" Operation. Durch die Wiederverwendung eines Size-Objektes kann man das reduzieren.
2. Wenn Size innerhalb von Screen static ist, dann kann es im System immer nur eine Bildschirmgröße geben. Ob das akzeptabel ist, hängt von Einzelfall ab; solange es eine (nicht-verteilte) Desktop-Applikation ist, würde ich das für OK halten. Wenn es um einen Server geht, der von verschiedenen Clients gelichzeitig beaufschlagt wird, dann geht das so nicht.