Packagename bei Objektinstanziierung

mrkennedie89

Mitglied
Hallo,

ich bin in einem Lehrbuch zu Android Studio (Sprache Java) an einer Stelle angekommen, an der es um die Formatierung der aktuellen Systemzeit als Ausgabe in einem TextView-Element geht. Nun steht vor mir folgender Code und ich verstehe nicht warum der komplette Packagename "android.text.format" hier stehen muss, um auf die Funktion getDateFormat() und getTimeFormat() zugreifen zu können. Das ist mir ehrlich gesagt völlig neu und noch nie vorgekommen. In welchen Fällen muss denn der Packagename so angegeben werden? Bzw. warum kann ich nicht einfach das gesamte Package am Anfang der Klasse importen und gut ist?

Java:
private DateFormat dateFormatter;

private DateFormat timeFormatter;



dateFormatter = android.text.format.DateFormat.getDateFormat(this);

timeFormatter = android.text.format.DateFormat.getTimeFormat(this);

Danke schonmal im voraus.
 

mrkennedie89

Mitglied
PS: Wenn ich versuche am Anfang die Anweisung: import android.text.format.DateFormat
zu geben, bekomme ich folgenden Fehler?

'android.text.format.DateFormat' is already defined in a single-type import
 

KonradN

Super-Moderator
Mitarbeiter
Generell musst Du das nur machen, wenn es mehrere Klassen mit gleichem Namen gibt und du beide verwenden willst.

DateFormat könnte da ein gutes Beispiel sein:
Android SDK hat das android.text.format.DateFormat
Java Framework hat java.text.DateFormat

Wenn Du also beides in einer Klasse brauchen würdest, dann kannst Du ja nur eine der Klassen importieren.

'android.text.format.DateFormat' is already defined in a single-type import
Das besagt, dass bereits eine Klasse DateFormat importiert wurde.

Bei sowas ist es immer gut, auch die ganze Datei zu zeigen. Dann könnte man sowas besser verifizieren und müsste nicht raten.
 

mrkennedie89

Mitglied
Generell musst Du das nur machen, wenn es mehrere Klassen mit gleichem Namen gibt und du beide verwenden willst.

DateFormat könnte da ein gutes Beispiel sein:
Android SDK hat das android.text.format.DateFormat
Java Framework hat java.text.DateFormat

Wenn Du also beides in einer Klasse brauchen würdest, dann kannst Du ja nur eine der Klassen importieren.


Das besagt, dass bereits eine Klasse DateFormat importiert wurde.

Bei sowas ist es immer gut, auch die ganze Datei zu zeigen. Dann könnte man sowas besser verifizieren und müsste nicht raten.
Hi danke für deine Antwort. Ich habe gerade mit deiner Hilfe erkannt, dass die Klasse DateFormat schon über java.text.Dateformat importiert worden ist. Und offensichtlich liefert die Methode getDateFormat() ein Objekt der Klasse java.text.DateFormat zurück. Irgendwie etwas merkwürdig. Die Methode ist wohl dann nur so aufrufbar. Weil wenn ich eine Variable der Klasse DateFormat aus dem Package android.text.format deklariere und dieses Package dann am Anfang importiert wird, funktioniert die Methode nicht mehr, da sie einen falschen Typ liefert.

Hier hab ich mal den ganzen Code:

Java:
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;



public class MainMenu extends AppCompatActivity {

    EditText etStartDateTime, etEndDateTime;
    Button btnStartCommand, btnEndCommand;

    Calendar calendar = Calendar.getInstance();

    private DateFormat dateFormatter;
    private DateFormat timeFormatter;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);

        etStartDateTime = findViewById(R.id.etStartDateTime);
        etEndDateTime = findViewById(R.id.etEndDateTime);
        btnStartCommand = findViewById(R.id.btnStartCommand);
        btnEndCommand = findViewById(R.id.btnEndCommand);

        dateFormatter = android.text.format.DateFormat.getDateFormat(this);
        timeFormatter = android.text.format.DateFormat.getTimeFormat(this);



        btnStartCommand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etStartDateTime.setText(calendar.getTime().toString());
            }
        });

        btnEndCommand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etEndDateTime.setText(calendar.getTime().toString());
            }
        });

    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Ja, du hast zwei Klassen mit gleichem Namen und daher kannst Du nur eine einbinden, so dass sie über den Namen alleine angesprochen wird und die andere muss dann voll qualifiziert mit Namespace angegeben werden.

Das lässt sich aber auch umdrehen. Du kannst android.text.format.DateFormat importieren und dann an den Stellen, wo java.text.DateFormat benötigt wird, dies so angeben.

Irgendwie etwas merkwürdig.
Dem stimme ich komplett zu! Vor allem ist das eine reine Utility Klasse - da gibt es nur static Methoden. Das wäre also besser eine DateTimeUtils oder von mir aus "DateTimes" Klasse - von den Namen her also angelehnt z.B. an die Arrays oder Objects Klassen, die Utility Methoden bereit stellt oder die StringUtils, die man in diversen Frameworks findet (z.B. Apache Commons).

Daher denke ich mal, dass Du das schon sehr gut beurteilt hast. Das ist aus meiner Sicht ein gutes Beispiel, wie man es nicht macht.

Zumal das damit noch nicht aufhört. Es gibt auch noch ein android.icu.text.DateFormat. Also schreib einmal einmal ein Post, dass Du eine Android App schreibst und Probleme mit DateFormat hast ... dann dürfen sich alle fragen, welche Klasse Du ggf. nutzt :)

Was man aber ggf. noch sagen kann:
Statt Instancen von DateFormater zu holen ist es evtl. ausreichend, direkt android.text.format.DateFormat.format aufzurufen.
 

KonradN

Super-Moderator
Mitarbeiter
Dann hast du wahrscheinlich beim Import mit zB (Alt +Enter) nicht aufgepasst und das Falsche ausgewählt.
Nein, es werden ja wirklich beide Klassen benutzt! Wenn Du Dir
anschaust, dann siehst Du, dass da eben ein
zurück gegeben wird.

Der TE hat also alles richtig gemacht. Da hat Google halt einfach nur ein gutes Beispiel abliefern wollen, wie man es eben nicht machen sollte.

Man kann ja über viele Design Entscheidungen diskutieren und unterschiedlicher Meinung sein. Aber im Augenblick verstehe ich nicht, wie man zu so einem Design kommen kann. Was haben sich die Entwickler da gedacht? Dualer Student in erster Praxisphase und ein Schüler mit einem Praktikums-Probetag hat den PR angenommen? Und alles, was Google danach eingefallen ist, ist eine Anpassung der Google Search-Engine, so dass die Seite mit der Doku von android.text.formater.DateFormat bei Suchen nicht mehr angezeigt wird sondern nur android.icu.text.DateFormat? (Sorry, aber ich hatte nach der Klasse geschaut und mich gewundert - Denn als ich eine Android Klasse DateFormat gefunden hatte, gab es keine getDateFormat Methode. Und selbst die Suche nach "android.text.format.DateFormat" gab mir nicht die Referenz der Klasse sondern nur diese icu Klasse. Die Referenz habe ich erst bekommen, nachdem ich die URL einfach manuell eingegeben habe!)

Mir fehlen da etwas die Worte. Wie gesagt: Man kann über vieles diskutieren und unterschiedlicher Meinung sein. Aber in diesem Punkt?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Packagename = Verzeichnisname? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben