public/private/etc-Deklarationen



  • Hi ich wollte kurz Fragen ob es in Java eine
    Möglichkeit wie in C++ gibt, dass man nicht
    vor jede Variable und Funktion etc. private usw. schreiben
    muss.
    Sowas wie:

    private:
    String aa;
    boolean bb;
    int cc;

    public:
    String dd;
    boolean ee;

    Danke!



  • Kurze Antwort: Nein!



  • Okay. Danke! (ich hoffe die basteln mal sowas rein, wäre schon angenehm)



  • Keine Chance.
    Auch im .NET gibts sowas nicht. Man kann sich aber echt an die Schreibweise gewöhnen.



  • Headhunter schrieb:

    Keine Chance.
    Auch im .NET gibts sowas nicht. Man kann sich aber echt an die Schreibweise gewöhnen.

    in c++.net und c++/cli schon :p



  • allein bei den Variablen wäre es ziemlich angenehm.
    Als C++ler fällt sowas mit als erstes auf, wenn man Java anfängt 🕶



  • Und vergiss es nicht, sonst hast du nur package-Zugriffsschutz. 🕶



  • Airdamn schrieb:

    Als C++ler fällt sowas mit als erstes auf, wenn man Java anfängt 🕶

    und die nicht vorhandenen Destruktoren fehlen dir gar nicht? 😮

    Da kann man in C++ doch ziemlich verquere Sachen mit veranstalten. 😃



  • Javaner schrieb:

    Airdamn schrieb:

    Als C++ler fällt sowas mit als erstes auf, wenn man Java anfängt 🕶

    und die nicht vorhandenen Destruktoren fehlen dir gar nicht? 😮

    Da kann man in C++ doch ziemlich verquere Sachen mit veranstalten. 😃

    Doch doch, die fehlen auch...da gibst sicher noch mehr, was einem fehlt 😉


  • Mod

    noobiezyx schrieb:

    Hi ich wollte kurz Fragen ob es in Java eine
    Möglichkeit wie in C++ gibt, dass man nicht
    vor jede Variable und Funktion etc. private usw. schreiben
    muss.
    Sowas wie:

    private:
    String aa;
    boolean bb;
    int cc;

    public:
    String dd;
    boolean ee;

    Danke!

    BTW: Ich finde diese Syntax in C++ eigentlich nicht besonders logisch. Warum sollten die Sichtbarkeitsattribute anders als andere Attribute angegeben werden? Man schreibt ja auch kein:

    const:
    int a = 5;
    char b = 6;
    


  • Gregor schrieb:

    ...
    BTW: Ich finde diese Syntax in C++ eigentlich nicht besonders logisch. Warum sollten die Sichtbarkeitsattribute anders als andere Attribute angegeben werden? Man schreibt ja auch kein:

    const:
    int a = 5;
    char b = 6;
    

    Naja, die Sichtbarkeitsattribute werden halt als Eigenschaften der Klasse und nicht als solche der einzelnen Elemente verstanden. Die Struktur der Klassendeklaration ist ja in C++ auch nicht ganz unwichtig (Reihenfolge der Elemente => Ausführungsreihenfolge(Ctor-Initialisierungsliste) ) ...

    Aber (obwohl ich größter C++-Fan und milder Java-Verachter bin 😉 ) ich hielte es auch plausibler, wenn es sich um "Element-Attribute" handelte .... und vA auch wartungstechnisch sicherer.

    Gruß,

    Simon2.



  • Javaner schrieb:

    Airdamn schrieb:

    Als C++ler fällt sowas mit als erstes auf, wenn man Java anfängt 🕶

    und die nicht vorhandenen Destruktoren fehlen dir gar nicht? 😮

    Dafür gibts doch finalize() [1], wenn man nicht ohne kann 😉

    [1] http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize()
    (URL Tag klappt nicht 🙄)



  • finalize() muss aber im Gegensatz zum Destruktur nicht aufgerufen werden, also verlasse dich nicht drauf. Mich hat das am Beginn auch sehr gestört, dass keine Destruktoren vorhanden sind.

    Es ist aber nunmal so, dass man da in Java einen anderen Weg geht: Selber schließen wenn man etwas selber geöffnet hat.

    MfG SideWinder


  • Mod

    ProgChild schrieb:

    Javaner schrieb:

    Airdamn schrieb:

    Als C++ler fällt sowas mit als erstes auf, wenn man Java anfängt 🕶

    und die nicht vorhandenen Destruktoren fehlen dir gar nicht? 😮

    Dafür gibts doch finalize() [1], wenn man nicht ohne kann 😉

    Falls es wer nicht weiß:

    finalize() bietet keinen Ersatz für Destruktoren. Es ist weder die Zeit vorhersehbar, wann so ein finalize() aufgerufen wird, noch wird garantiert, dass es überhaupt irgendwann aufgerufen wird. Weiterhin kann man in einem finalize() eine neue Referenz auf das jeweilige Objekt erzeugen und das Objekt so doch noch am Leben halten. ...mit anderen Worten: Das ist etwas völlig anderes. finalize() hat auch einen anderen Zweck. ...bzw: Fast gar keinen Zweck. Die einzige sinnvolle Verwendung, die ich mir vorstellen könnte, wäre als eine Art Backup-System, um bei einer falschen Verwendung einer Klasse die Auswirkungen der falschen Verwendung abzuschwächen. Zum Beispiel könnte man da nochmal ein close() bei einem Stream aufrufen.



  • Das Sprachmittel für deterministische Destruktion in Java ist finally. Die Syntax ist umständlicher, dafür kann man in finally beliebige Sachen machen, die nicht an den Destruktor eines Objekts und damit auch nicht an den runtime-type dessen gebunden sind.

    Für Java eigentlich eine ganz gute Lösung, da man von Haus aus nur 10% soviel Destruktion braucht. Die meisten Destruktionen in C++ drehen sich halt doch um die Speicherverwaltung. Für C++ wären finally-Blöcke wahrscheinlich keine so tolle Lösung, da sie IMHO schwieriger zu warten sind. C++/CLI bietet interessanterweise auch finally an.


Anmelden zum Antworten