Java == C#.Net

Das Programmieren in verschiedenen Sprachen und Studios ist eine Selbstverständlichkeit. Damit Programmiersprachen und Arbeitsumgebungen auch bei der Personalsuche in den Hintergrund treten und das Talent der Entwickler in den Vordergrund gestellt werden kann, kommen meiner Meinung nach nur gründliche Einstellungstests infrage. Dabei ist es möglich aus einer großen Zahl von Bewerbern, durch geeignete Verfahren (die mir aus eigener Erfahrung bekannt sind), überragende Teams herauszuholen.

Hier befasse ich mich jetzt jedoch nur mit etwas C# + MS Visual Studio .Net und Java + Eclipse. Viel programmierte ich in C# und wusste, dass Java sehr ähnlich ist, als ich dann allerdings etwas in Java programmierte, merkte ich schnell, dass es noch viel ähnlicher war, als ich es in Erinnerung hatte. Hier will ich nun ein paar Programmausschnitte zeigen, wie sie in Java und in C# aussehen, das Ganze anhand eines kleinen Beispielprogramms. Außerdem werde ich auf die Studios eingehen und beleuchten, was auf einen so kurzen Blick mächtiger erscheint.

Hauptsächlich unbeachtet bleiben die Möglichkeiten mittels Erweiterungen den Funktionsumfang zu verbessern, einige spreche ich jedoch an. Die Leistung, Geschwindigkeit und Verbreitung ist kein Thema dieses Eintrags.

Das Beispielprogramm

Zur Lehranschauung programmierte ich ein Arbeitsstunden-Programm in Java mit folgenden Funktionen:

  1. Verwaltung von Mitarbeitern
  2. Eintragung von Stunden
  3. Einlesen der Stunden von Mitarbeitern aus einer Datei
  4. Speichern der Stunden von Mitarbeitern

Weitere Eigenschaften werden berücksichtigt:

  1. Dateioperationen werden im Hintergrund ausgeführt, in einem separaten Thread
  2. Es wird regelmäßig nach einer Datei gesucht, aus der weitere Stunden eingetragen werden sollen
  3. Es gibt eine Obergrenze täglicher Stunden
  4. Stunden werden summiert
  5. Datumsangaben werden nur zur aktuellen sowie letzten Eingabe genutzt

Anhand dieses Programms will ich aufzeigen, wie ähnlich die Programmierung in C# ist.

Bibliotheken und Funktionen

Thread Programmierung

Was mit Winforms bei der Thread Programmierung üblich war, das ist dem in Java sehr ähnlich und auch in WPF Anwendungen ähnlich geblieben.

So finden wir in C# folgende schreibweise für den anschließend gleichen Sachverhalt in Java, um aus einem Thread heraus Anzeigen einer Benutzeroberfläche zu ändern.
Hierfür wurden oder waren bereits alle nötigen Bibliothken von Visual Studio automatisch eingebunden.

public voidSetStatus(String status)
{
SetLabelString(lblStatus, status);
}

2 Verweise
private voidSetLabelString(Label lbl, String str)
{
if (!Dispatcher.CheckAccess())
{
DelegateLabelString d = new DelegateLabelString(SetLabelString);
try { this.Dispatcher.BeginInvoke(d, new object[] { lbl , str }); return; catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Invoke Error: " + ex.ToString()); }
// or without defined delegate (more easily)
try { this.Dispatcher.BeginInvoke(new Action(() => { lbl.Content = str ; })); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Invoke Error: " + ex.ToString()); }
}
else
{
lbl.Content = str ;
}
}
delegate voidDelegateLabelString(Label lbl, string str);

Die Funktion SetStatus kann aus anderen Klassen aufgerufen werden, um die Anzeige zu ändern.
Auch zu sehen ist der kleine Schriftzug 2 Verweise, der bei Anklicken gleich auflistet, wo die Funktion verwendet wird. In Eclipse hingegen findet man gleiches im Rechtsklick-Kontextmenü unter References oder mittels Ctrl+Shift+G.

public void setHours(float allHours) {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setHours(allHours);
}
});
return;
}
txtpnSummeAllerMitarbeiter.setText("Stunden aller Mitarbeiter: "+Float.toString(allHours));
}

Die Funktion setHours kann aus anderen Klassen, Threadübergreifend aufgerufen werden, um die Stundenzahl auf der Benutzeroberfläche zu aktualisieren.
In Eclipse musste jedoch erst Swing(Utilities) eingebunden werden, um die grafische Oberflächengestaltung mittels javax.swing(.JFrame) im Designer zu ermöglichen.

Synchronisierung

Die Semaphore in Java fand ich praktischer als die aus C#.Net, denn sie sind flexibler.

java.util.concurrent.Semaphore javaSemaphore = new Semaphore(0);
javaSemaphore.tryAcquire(); // false
javaSemaphore.release();
javaSemaphore.acquire(); // true
javaSemaphore.drainPermits(); // javeSemaphore stayes at zero
javaSemaphore.release();
javaSemaphore.release();

System.Threading.Semaphore dotNetSemaphore = new(0, 1);
dotNetSemaphore.WaitOne(MillisecoundsToMaxWaitOn); // false
dotNetSemaphore.Release();
dotNetSemaphore.WaitOne(); // true
dotNetSemaphore.Release();
dotNetSemaphore.Release(); //throws an error

Die Begrenzung bei dotNet kann zur Überprüfung fehlerhafter und zu häufiger Freigaben nützlich sein.

Daten Einbinden

Datenquellen kann man mit praktischen Komponenten einbinden. Im Visual Studio ist das u. a. das Entity Framework und eine BindingSource-Komponenten mit der die Anzeige einer Tabelle wie von selbst vonstatten läuft. In WinForms war das noch ein BindingSource Objekt, In WPF wird mittels DataView eine Anzeige möglich (siehe folgendes Beispiel). In Java fand ich in der Kürze zur Darstellung von Tabellen das DefaultTableModel und den TableModelListener, so ergab sich in Java etwas mehr Programmierarbeit, denn es musste die Tabellenstrucktur ohne Designer erstellt werden. Es gibt allerdings wohl open source Komponenten dafür, die ungetestet blieben.
(Mehr auf https://learn.microsoft.com/de-de/dotnet/desktop/wpf/data/?view=netdesktop-6.0)

myDataSetClassname myDataSetVar = new myDataSetClassname();
myDataSetVar.Init;
mDataGrid.AutoGenerateColumns = true;
mDataGrid.ItemSource = myDataSetVar?.Tables["DataTable1"]?.DefaultView;

In Java habe ich für das Beispielprogramm die Klasse MitarbeiterTable.java geschrieben. Und für die Anzeige brauchte es dazu folgenden Code:

JPanel panel_1 = new JPanel();
contentPane.add(panel_1, BorderLayout.CENTER);
mTable = MitarbeiterTable.getInstance();
mTable.getTable().setShowGrid(true);
...
panel_1.setLayout(new BorderLayout(0, 0));
panel_1.add(mTable.getTable(), BorderLayout.CENTER);
JScrollPane scrollPane = new JScrollPane(mTable.getTable());
panel_1.add(scrollPane, BorderLayout.CENTER);

Allerdings halte ich solche Unterschiede für vernachlässigbar. Es ist natürlich schneller, wenn man weniger zu programmieren braucht. Es ist jedoch egal wie es umzusetzen ist, denn kennt man erst die Umsetzung aus einer Sprache, so findet sich in jeder anderen ein Äquivalent.

Studios und Erweiterungen

Studios

Visual Studio

An dem Visual Studio hatte ich stets am meisten Freude, das hat mehrere Gründe.

  1. Es lief auch bei teils defekter Hardware, ohne Datenverluste und ohne Projektdaten zu beschädigen (Android Studio zerschoss stets das Projekt). Der erfahrene Schaden war ein fehlerhafter Arbeitsspeicher.
  2. Erweiterungen zu suchen und zu installieren, ist sehr übersichtlich gestaltet.
  3. Mein Git Repository war schnell und einfach zu nutzen.
  4. Die intelligente Programmierunterstützung war oft hilfreich.
  5. Inlinedokumentation trug schon sehr früh mittels Parameter und Beschreibungen zur Übersicht bei.
  6. Leicht bedienbare Code- und Leistungsanalysen halfen schon öfters bei der Fehlersuche.
  7. Der Geräte (Smartphone) Emulator ist mit wenigen Klicks eingerichtet.
  8. Ohne tieferes Verständnis ließen sich eigene Controls schnell und einfach entwickeln.
  9. Das Entity Framework nahm einem viel Arbeit in der Datenanbindung ab.
  10. Die Designer sind sehr intuitiv bedienbar.

Viele Möglichkeiten mehr, die das Studio bietet, habe ich noch nie getestet. Tatsächlich würde ich eher prüfen, ob »Visual Studio Code« für meine Belange evtl. schon hinreichend ist.

Eclipse

Eclipse gefällt mir heute viel besser. Nach dem Entwickeln des Beispielprogramms erkenne ich an, dass meine Erinnerung an das Eclipse, das ich kannte, aus vergangener Zeit stammt. Etwas weniger intuitiv finde ich dort die gleichen Komponenten, wie im Visual Studio. In Eclipse findet sich beispielsweise unter Help – Eclipse Marketplace, was man im Visual Studio so ähnlich unter Erweiterungen – Extensions verwalten finden kann. Das Meiste findet sich irgendwo und irgendwie wieder.

Etwas weniger begeistert war ich von dem Designer, denn die Anordnung funktionierte nicht ganz so gut wie im Visual Studio, aber das Ergebnis war schlussendlich das gewollte, ich denke, dass dies zur Eingewöhnung gehört.

Trotz fehlerhaftem Arbeitsspeichers hat auch Eclipse den Workspace intakt gelassen und lief reibungslos.

Erweiterungen

Entity Framework

Es gibt Tutorials für das Entity Framework. Nachdem ich ein etwa 200-seitiges Tutorial durchgearbeitet hatte, war ich überzeugt davon, dass es fast intuitiv nutzbar ist und immer verwendet werden sollte, wenn man Datenbanken benutzt.

Unter Eclipse erfüllen evtl. die zwei open source Erweiterungen SQL DAL Maker und KPA Diagram Editor gleiches oder annähernd gleiches. Der Umfang des Tutorials zeigt auf, warum ich mir diese Erfahrung, das zu testen, für einen späten Zeitpunkt aufgehoben habe.

Swing

JDialog und JFrame fand ich im Projektexplorer unter Rechtsklick – New – Other... oder Ctrl + N, als die Objekte, die ich für eine vom Designer unterstützte Oberfläche brauchte, im Ordner SwingDesigner, Unterordner von WindowBuilder mittels Suchfunktion.

Launch4j

Um eine ausführbare exe-Datei zu erhalten, kann die jar-Datei von Eclipse mittels Lounch4j in eine solche umgewandelt werden.

JavaSE 9 wählte ich in Eclipse aus und als minimal Version gab ich 9.0.0 im Tool launch4j ein, so funktionierte es. Mit Auswahl der Ausgabedatei und der Jar-Datei und des Icons und des Speicherns der Config durch Klick auf das Zahnrad. Allerdings sollte die Datei signiert werden, weil sie sonst vielleicht von einem Antivirus gelöscht wird.

(Siehe auch https://de.wikihow.com/Aus-Eclipse-eine-ausf%C3%BChrbare-Datei-erzeugen)

Unter Properties – Java Build Path – Libraries – Modulepath – JRE System Library – Edit... - Execution environment galt es JavaSE 9 (jre) auszuwählen, das wirkte anfangs tatsächlich ein wenig versteckt.

Fazit

Java != C#, aber ob C#, Java oder Kotlin, es programmiert sich alles gleich und liegt schon ein Programm vor, so wird es kinderleicht es in andere Sprachen zu übernehmen, wie C++. Es gibt wohl kaum einen, der die Bibliotheken auswendig kennt, wie auch kaum einen, der das Lexikon oder den Duden auswendig kennt. Stets geht es darum nur, um ein kleines bisschen Syntax, weil alles andre schlägt man eh nach.
Der Aufbau ist ein anderes Thema, den es zu erkennen gilt, um sich zurechtzufinden. Vielleicht liegt es manchem besser oder schlechter, womöglich kann es der Freie besser, weil er sich häufiger auf veränderte Arbeitsumgebungen einstellt.
Oder in anderen Worten:

Es kann, was lebt und webet
in Freiheit nur gedeih'n,
das Ebenbild des Schöpfers
kann nur der Freie sein.
August Heinrich Hoffmann von Fallersleben (1798-1874)

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich