Ukrywanie informacji
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 12 z 87.
Ukrywanie informacji to zasada ograniczania bezpośredniego dostępu do wewnętrznych danych obiektu. Łącząc pola private z metodami pobierającymi i ustawiającymi, tworzysz barierę ochronną wokół stanu obiektu.
Zastanów się, co się dzieje bez ukrywania informacji:
public class Temperature {
public double celsius; // Bezpośrednio dostępne
}
// Każdy może ustawić nieprawidłowe wartości
Temperature t = new Temperature();
t.celsius = -500; // Poniżej zera absolutnego – niemożliwe!Dzięki ukrywaniu informacji kontrolujesz sposób uzyskiwania dostępu do danych i ich modyfikowania:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}Nieprawidłowe temperatury są teraz automatycznie odrzucane. Reprezentacja wewnętrzna jest ukryta — możesz później zmienić sposób przechowywania temperatury wewnętrznie (na przykład na kelwiny), nie wpływając na kod korzystający z tej klasy.
To podejście oferuje trzy kluczowe korzyści: walidacja zapewnia integralność danych, elastyczność pozwala wprowadzać wewnętrzne zmiany bez psucia zewnętrznego kodu, a kontrola umożliwia dokładne określenie, jakie operacje na danych są dozwolone.
Wyzwanie
ŁatwyUtwórzmy klasę do zarządzania Password, która demonstruje ukrywanie informacji przez ochronę wrażliwych danych i egzekwowanie zasad bezpieczeństwa za pomocą kontrolowanego dostępu.
Utworzysz dwa pliki, aby uporządkować swój kod:
Password.java: Utwórz klasę Password, która ukrywa swoje dane wewnętrzne i kontroluje sposób ustawiania haseł oraz uzyskiwania do nich dostępu:- Prywatne pole
password(String), które przechowuje rzeczywiste hasło - Prywatne pole
minLength(int), które określa minimalną akceptowalną długość hasła - Konstruktor, który przyjmuje wymaganie dotyczące minimalnej długości
- Setter
setPassword(String password), który akceptuje tylko hasła spełniające wymaganie dotyczące minimalnej długości. Jeśli hasło jest prawidłowe, zapisz je i zwróćtrue; jeśli jest za krótkie, nie zmieniaj hasła i zwróćfalse - Getter
getMaskedPassword(), który zwraca hasło ze wszystkimi znakami zastąpionymi gwiazdkami (*) — nigdy nie ujawniaj rzeczywistego hasła! - Metoda
checkPassword(String attempt), która zwracatrue, jeśli próba pasuje do zapisanego hasła, a w przeciwnym raziefalse - Getter
getLength(), który zwraca długość bieżącego hasła (lub 0, jeśli nie ustawiono hasła)
- Prywatne pole
Main.java: Utwórz obiekt Password z minimalną długością 6, a następnie odczytaj dwa dane wejściowe: hasło do ustawienia i próbę hasła do sprawdzenia. Wypisz trzy wiersze:Set: truelubSet: false(wynik ustawiania hasła)Masked: ******(zamaskowana wersja hasła)Match: truelubMatch: false(wynik sprawdzania próby)
Otrzymasz dwa dane wejściowe: hasło do ustawienia oraz próbę hasła do sprawdzenia.
Zwróć uwagę, że rzeczywiste hasło nigdy nie jest bezpośrednio dostępne spoza klasy — to właśnie działanie ukrywania informacji. Klasa dokładnie kontroluje, jakie informacje są ujawniane i w jaki sposób można zmodyfikować hasło.
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Odczytaj hasło do ustawienia
String passwordToSet = scanner.nextLine();
// Odczytaj próbę podania hasła do sprawdzenia
String passwordAttempt = scanner.nextLine();
// TODO: Utwórz obiekt Password o minimalnej długości 6
// TODO: Ustaw hasło i wypisz wynik ("Set: true" lub "Set: false")
// TODO: Wypisz zamaskowane hasło ("Masked: ******")
// TODO: Sprawdź próbę podania hasła i wypisz wynik ("Match: true" lub "Match: false")
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online