JavaRush /Blog Java /Random-PL /Przerwa kawowa #121. Co to jest Classpath w Javie i jak j...

Przerwa kawowa #121. Co to jest Classpath w Javie i jak ją zainstalować? Niezmienność w Javie

Opublikowano w grupie Random-PL

Co to jest Classpath w Javie i jak ją zainstalować?

Źródło: Medium Znajomość podstaw programowania i przepływu plików programu pomaga nam zrozumieć język. Znajomość parametru Classpath to jedno z podstawowych pojęć, które powinien znać każdy programista Java. Dzisiaj omówimy, czym jest ścieżka klasy ( Classpath ), jak ją ustawić i jak pomaga maszynie JVM w wykonywaniu plików klas. Przerwa kawowa #121.  Co to jest Classpath w Javie i jak ją zainstalować?  Niezmienność w Javie - 1

Co to jest ścieżka klas?

Ścieżka klas jest jednym z podstawowych parametrów w Javie, ale nowicjusze często ją błędnie rozumieją. W uproszczeniu ścieżka klas to po prostu zbiór ścieżek , wzdłuż których kompilator Java i maszyna JVM muszą znaleźć klasy niezbędne do skompilowania lub wykonania innych klas.

Jak Classpath pomaga JVM w wykonywaniu plików klas

Zacznijmy od przykładu. Załóżmy, że mamy plik Main.java , który znajduje się w folderze /Users/vikram/Documents/test-java/src/com/programming/v1/Main.java .
package com.programming.v1;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello classpath");
    }
}
Powiedzmy, że jesteśmy w /Users/vikram/Documents i chcemy skompilować tę klasę:
javac test-java/src/com/programming/v1/Main.java
Teraz, aby uruchomić ten plik klasy, musimy powiedzieć wirtualnej maszynie Java, gdzie szukać pliku .class , używając ścieżki klasy lub flagi cp w poleceniu Java .
vg@lp1 Documents % java -cp "test-java/src" com.programming.v1.Main
Hello classpath
vg@lp1 Documents % java -classpath "test-java/src" com.programming.v1.Main
Hello classpath
Pierwszym parametrem jest folder główny, w którym zapisywany jest pakiet. Drugi parametr to nazwa pakietu z nazwą klasy. Po wykonaniu polecenia Java wirtualna maszyna Java przegląda folder test-java/src , a następnie ładuje klasę główną, aby je wykonać.

Jak ustawić zmienną Classpath

Zmienną Classpath można ustawić w sposób pokazany poniżej na komputerach z systemem Linux:
export CLASSPATH="test-java/src"
Ścieżkę klas na komputerze z systemem Windows można dodać/zaktualizować przy użyciu zmiennych środowiskowych. Po ustawieniu zmiennej środowiskowej można wykonać polecenie Java , jak pokazano poniżej:
vg@lp1 Documents % java com.programming.v1.Main
Hello classpath
To wszystko, co warto wiedzieć o Classpath . Dziękuję za przeczytanie!

Niezmienność w Javie

Źródło: Średnie Zmienne w Javie są dwojakiego rodzaju: pierwotne i referencyjne. Wszystko w Javie przekazywane jest przez wartość, ale w przypadku typów referencyjnych dane źródłowe można aktualizować przy użyciu przekazanego adresu pamięci. Przerwa kawowa #121.  Co to jest Classpath w Javie i jak ją zainstalować?  Niezmienność w Javie - 2Słowo kluczowe final służy do tego, aby zmienna działała jak stała, to znaczy unikała ponownego przypisania. Działa to dobrze w przypadku prymitywów, które nie mają pamięci sterty, podczas gdy w przypadku typów referencyjnych jedynie ponowne przypisanie jest ograniczone i można zmienić stan wewnętrzny. Może to prowadzić do wielu problemów ze współbieżnością i warunków wyścigowych. Zatem włączenie niezmiennych cech do zwykłego typu w Javie zapewnia wiele korzyści.

Korzyści z niezmienności w Javie

1. Bezpieczeństwo nici

Typy niezmienne są odporne na warunki wyścigu w środowisku wielowątkowym, ponieważ obiekt pozostanie spójny po utworzeniu. Wiele wątków nie może zmienić swojego stanu wewnętrznego, więc synchronizacja nie jest wymagana.

2. Typ podstawowy

Dobrym przykładem klasy bazowej jest ciąg znaków w standardowej bibliotece Java. Jest to bardzo prosta i niezmienna klasa, której można używać do budowania na jej podstawie domen logiki biznesowej. Podobnie typ niezmienny może działać jako świetny typ podstawowy, na którym można budować.

Charakterystyka

1. Pola prywatne i końcowe

Pola zawierające stan obiektu są prywatne i ostateczne . Widoczność prywatna uniemożliwia bezpośredni dostęp do pola, natomiast widoczność ostateczna gwarantuje , że pole zostanie przydzielone tylko raz.

2. Brak metod modyfikujących

Do pola prywatnego nie można uzyskać dostępu poza klasą. Zwykle do odczytu i zapisu pól służą odpowiednio metody dostępu (gettery) i metody modyfikatorów (settery). Aby zapewnić spójność, modyfikatory nie są dozwolone.

3. Zajęcia końcowe

Zezwolenie na dziedziczenie klas może złamać niezmienność. Podklasa rozszerzająca niezmienną klasę może wpływać na stan obiektu. Dlatego zajęcia są ostateczne .

4. Kopie obronne

Podczas tworzenia obiektu, zamiast przypisywać argumenty konstruktora bezpośrednio do pól prywatnych, utworzenie głębokiej kopii (lub niezmiennej kopii) argumentów zapewni zewnętrzną modyfikację. Jeśli jeden z argumentów jest typem referencyjnym, można nim łatwo manipulować po stronie wywołującej. Tworzenie kopii ochronnych pozwala uniknąć tej manipulacji. Podobnie w przypadku akcesorów (getterów) zamiast bezpośrednio odwoływać się do pola wewnętrznego, można swobodnie udostępniać jego kopię.

Realizacja

Pracownik

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public final class Employee {

    private final long id;
    private final String name;
    private final LocalDate joinDate;
    private final List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public LocalDate getJoinDate() {
        return joinDate;
    }

    public List<String> getAchievements() {
        return achievements;
    }
}
  • Nie wszystkie pola mają w konstruktorze kopie ochronne. Dzieje się tak, ponieważ id jest pierwotny, a pola name i JoinDate są typami niezmiennymi. Nie mogą one zostać zmienione przez osobę wywołującą i pozostaną niezmienione, natomiast pole osiągnięć wymaga kopii argumentu wykonanego metodą List.copyOf . Dzieje się tak, ponieważ copyOf zwraca niezmienną List .

  • Podobnie metody dostępu zwracają pola bezpośrednio, a nie kopie obronne, ponieważ wszystkie typy pól są niezmienne (w tym osiągnięcia ) i dlatego nie można ich modyfikować poza klasą.

Ulepszenia

Przed Javą 16

Implementację pracownika można ulepszyć za pomocą bibliotek takich jak Lombok . Zmniejsza to szczegółowość kodu i sprawia, że ​​wygląda on bardziej przejrzyście. Biblioteka zawiera adnotacje umożliwiające skrócenie standardowego kodu. @Value (adnotacja) może służyć do tworzenia modułów pobierających i konstruktora dla wszystkich argumentów. Tworzy to również klasę końcową oraz pola prywatne i końcowe . Uwaga, generuje także metody toString , równa się i hashCode . Implementację pracownika można przepisać przy użyciu @Value , jak pokazano poniżej:
import lombok.Value;

import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

@Value
public class Employee {

    long id;
    String name;
    LocalDate joinDate;
    List<String> achievements;

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

Java 16 i nowsze

W wersji Java 16 wprowadzono nową funkcję nagrywania . Są to (jak stwierdził JEP) klasy, które działają jako przezroczyste nośniki niezmiennych danych i można je traktować jako nominalne krotki. Klasę Pracownik można ponownie zaimplementować jako rekordowy Pracownik , jak pokazano poniżej.
import java.time.LocalDate;
import java.util.List;

import static java.util.List.copyOf;

public record Employee(long id,
                       String name,
                       LocalDate joinDate,
                       List<String> achievements) {

    public Employee(long id,
                    String name,
                    LocalDate joinDate,
                    List<String> achievements) {
        this.id = id;
        this.name = name;
        this.joinDate = joinDate;
        this.achievements = copyOf(achievements);
    }
}

Wady

Jedynym problemem związanym z niezmiennością jest dodatkowa pamięć i przetwarzanie, których wymaga nawet niewielka modyfikacja. Za każdym razem trzeba stworzyć nowy obiekt, co może być bardzo kosztowne. Aby obejść tę wadę, można wdrożyć mechanizmy takie jak buforowanie i zapisywanie wyników.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION