Programmieren Tutorium 12

Packages

Gliederung

  • Pakete
  • == vs. equals
  • Datenkapselung
  • Scope

Pakete

Package? Was ist das?

Programs are organized as sets of packages. Each package has its own set of names for types, which helps to prevent name conflicts.

JLS §7

  • Dienen zur Strukturierung von Programmen
  • Bilden seperate Namensräume

Beispiel Integer

package java.lang;

import java.util.Properties;

public final class Integer extends Number implements Comparable<Integer> {
    //... class body ...
}
  • ist im Package java.lang
    • muss im richtigen Ordner liegen
    • muss in der Datei deklariert sein (package)
  • importiert die Klasse java.util.Properties
    • funktioniert über das Keyword import

Paketnamen

  • werden komplett klein geschrieben
  • werden direkt auf Verzeichnisse abgebildet
    • java.lang.Integer liegt in java/lang/Integer.java
  • werden aus umgekehrten Domain-Namen gebildet
    • util-Package von mir: de.raphinesse.util

Fully Qualified Class Name

Math.pow(x, 2);
java.util.Locale loc = java.util.Locale.UK;
  • Fully Qualified Class Name: Klassenname mit Paket-Präfix
    • muss etwa bei Namenskonflikten verwendet werden
  • java.lang.* ist immer verfügbar, auch ohne import

Weitere import-Möglichkeiten

import java.util.*;

import static java.lang.System.out;

import static java.lang.Math.*;
  1. Bindet alle Klassen aus dem Paket java.util ein
    • nicht rekursiv
    • eher vermeiden
  2. Bindet statische Attribute oder Methoden ein
    • ebenfalls sparsam verwenden
  3. Bindet alle statischen Member einer Klasse ein

package-private

package de.raphinesse.animals

public class FatOrangeCat {
    String lastMeal;

    private boolean lasagnaOverkill;

    public void eat() {
        lastMeal = "Lasagna";
    }
}
  • Das Attribut lastMeal ist hier package-private
    • erkenntlich durch fehlenden Modifier
    • sichtbar für alle Klassen des Packages de.raphinesse.animals
  • sub-packages haben keinen priviligierten Status
    • java.lang.reflect ist nicht im Package java.lang

== vs. equals

==

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1 == str2);

str2 = str1;
System.out.println(str1 == str2);

Ausgabe: false, true

  • Bei Objekten prüft == ob es sich um das selbe Objekt handelt
    • Das Gleiche gilt auch für Arrays

equals

String str1 = "abc";
String str2 = new String("abc");
String str3 = str2;

System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str2.equals(str3));

Ausgabe: 3 × true

  • Vergleicht den „Inhalt“ der Objekte
  • Nimmt als Parameter ein anderes Objekt

Datenkapselung

Was ist das?

Encapsulation is used to hide the values or state of a structured data object, preventing unauthorized parties’ direct access to them. Publicly accessible methods are generally provided in the class to access the values.

Wie setze ich es um?

  • Attribute sind nicht von außen zugänglich
    • etwa private
  • Nötige Zugriffe werden kontrolliert geregelt
    • Stichworte Getter und Setter

Vorteile

  • Erhöhte Übersichtlichkeit, da nur die öffentliche Schnittstelle betrachtet werden muss
  • Deutlich verbesserte Testbarkeit, Stabilität und Änderbarkeit der Software
  • Bei Verwendung von Zugriffsfunktionen spielt es keine Rolle, ob ein Attribut im Inneren der Klasse existiert, der Wert berechnet wird, oder aus anderen Quellen stammt

Scope

Was ist das?

Unter dem Geltungsbereich einer Variablen versteht man den Programmabschnitt, in dem die Variable nutzbar und sichtbar ist

  • Werden in Java immer durch geschweifte Klammern markiert
  • Scopes (Geltungsbereiche) sind hierarchisch
    • Jeder Block „sieht“ die Variablen „über“ ihm
  • Siehe auch Shadowing

Beispiel

public class Scope {
    public static void main(String[] args) {
        int foo = 0;
        {
            int bar = 0;
            double foo = 0.0;
            System.out.println(bar);
            System.out.println(foo);
        }
        System.out.println(foo);
        System.out.println(bar);
    }
    public static void qux() {
        int foo = 1;
        System.out.println(foo);
    }
}
  • double foo: Duplicate local variable foo
  • System.out.println(bar): bar cannot be resolved
  • int foo in qux hat nichts mit int foo in main zu tun

Feierabend!

© http://xkcd.com/281/