JavaRush /Blog Java /Random-PL /Przerwa kawowa #134. Czego unikać pisząc kod w Javie. Jak...

Przerwa kawowa #134. Czego unikać pisząc kod w Javie. Jak final, final i finalize są używane w Javie

Opublikowano w grupie Random-PL

Czego unikać podczas pisania kodu Java

Źródło: Medium Zwracamy uwagę na artykuł zawierający listę typowych błędów popełnianych przez programistów podczas pisania kodu Java. Przerwa kawowa #134.  Czego unikać pisząc kod w Javie.  Jak komendy final i finalize są używane w Javie - 1

Korzystanie z wartości wyliczeniowych

Fakt, że uznano to za błąd, zaskoczył mnie, ponieważ regularnie korzystałem z Enum.values . Problem polega na tym, że według specyfikacji Enum.values() ma być niezmienną listą. Aby to zrobić, przy każdym wywołaniu musi zwrócić nową instancję tablicy z wartościami wyliczeniowymi.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
W pamięci znajdują się dwa oddzielne obiekty, więc może się wydawać, że nie jest to wielka sprawa. Ale jeśli użyjesz Fruit.values() podczas przetwarzania żądania i będziesz mieć duże obciążenie, może to prowadzić do problemów z pamięcią. Możesz łatwo to naprawić, wprowadzając prywatną statyczną zmienną końcową VALUES do buforowania.

Przekazywanie parametrów opcjonalnych jako parametru metody

Rozważ następujący kod:
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Podajemy opcjonalny parametr strefaId i na podstawie jego obecności decydujemy, czy podać czas w systemowej strefie czasowej, czy skorzystać z określonej strefy. Nie jest to jednak właściwy sposób pracy z opcją Opcjonalną. Powinniśmy unikać używania ich jako parametrów i zamiast tego używać przeciążania metod.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
Kod, który widzisz powyżej, jest znacznie łatwiejszy do odczytania i debugowania.

Korzystanie z StringBuilder’a

Ciągi znaków w Javie są niezmienne. Oznacza to, że po utworzeniu nie można ich już edytować. JVM utrzymuje pulę ciągów i przed utworzeniem nowej wywołuje metodę String.intern() , która zwraca instancję z puli ciągów odpowiadającą wartości, jeśli taka istnieje. Załóżmy, że chcemy utworzyć długi ciąg znaków, łącząc w nim elementy.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
Niedawno powiedziano nam, że to bardzo zły pomysł, ponieważ starsze wersje Java wykonywały następujące czynności:
  • w linii 1 ciąg „start” jest wstawiany do puli ciągów i wskazywany przez longString
  • linia 2 dodaje ciąg „startmiddle” do puli i wskazuje na niego za pomocą longString
  • w linii 3 mamy „startmiddlemiddle”
  • w linii 4 - „startmiddlemiddlemiddle”
  • i na koniec w linii 5 dodajemy do puli „startmiddlemiddlemiddleend” i wskazujemy na nią longString
Wszystkie te wiersze pozostają w puli i nigdy nie są używane, co powoduje marnowanie dużej ilości pamięci RAM. Aby tego uniknąć, możemy użyć StringBuilder.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder tworzy tylko jeden ciąg znaków po wywołaniu metody toString , pozbywając się w ten sposób wszystkich ciągów pośrednich, które początkowo zostały dodane do puli. Jednak po Javie 5 kompilator robi to automatycznie , dlatego lepiej jest użyć łączenia ciągów za pomocą „+”.

Używanie prymitywnych opakowań, gdy nie są potrzebne

Rozważ następujące dwa fragmenty:
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Pierwszy przykład działa sześć razy szybciej niż drugi na moim komputerze. Jedyna różnica polega na tym, że używamy klasy opakowania Integer. Sposób działania Integer polega na tym, że w linii 3 środowisko wykonawcze musi przekonwertować zmienną sumy na pierwotną liczbę całkowitą (automatyczne rozpakowywanie), a po dodaniu wynik jest następnie zawijany do nowej klasy Integer. (pakowanie automatyczne). Oznacza to, że tworzymy 1 milion klas Integer i wykonujemy dwa miliony operacji pakowania, co wyjaśnia dramatyczne spowolnienie. Klasy opakowania powinny być używane tylko wtedy, gdy muszą być przechowywane w kolekcjach. Jednak przyszłe wersje Java będą obsługiwać kolekcje typów pierwotnych, co sprawi, że opakowania staną się przestarzałe.

Jak final, final i finalize są używane w Javie

Źródło: Newsshare W tym artykule dowiesz się gdzie, kiedy i dlaczego używane jest słowo kluczowe Finalize oraz czy w ogóle warto go używać w Javie. Poznasz także różnice pomiędzy final, final i finalize.

Gdzie używany jest ostatecznie blok?

Blok last w Javie służy do przechowywania ważnych części kodu, takich jak na przykład kod czyszczący, zamykanie pliku lub zamykanie połączenia. Blok Final jest wykonywany niezależnie od tego, czy został zgłoszony wyjątek i czy został on obsłużony. A w końcu zawiera wszystkie ważne instrukcje, niezależnie od tego, czy wystąpi wyjątek, czy nie.

Jak sfinalizować zmienną w Javie?

Istnieją 3 sposoby zainicjowania końcowej zmiennej Java:
  • Możesz zainicjować zmienną końcową po jej zadeklarowaniu. To podejście jest najczęstsze.
  • Pusta zmienna końcowa jest inicjowana w bloku inicjatora instancji lub konstruktorze.
  • Wewnątrz bloku statycznego inicjowana jest pusta końcowa zmienna statyczna.

Czy możemy wywołać metodę finalizacji ręcznie w Javie?

Metoda finalize() nie jest konieczna i nie zaleca się jej wywoływania, gdy obiekt wykracza poza zakres. Ponieważ nie wiadomo z góry, kiedy (i czy) zostanie wykonana metoda finalize() . Ogólnie rzecz biorąc, finalizacja nie jest najlepszą metodą, chyba że istnieje konkretna potrzeba. Począwszy od wersji Java 9, jest ona przestarzała.

Kiedy wywoływana jest metoda finalizacji?

Metoda finalize() jest wywoływana w celu przeprowadzenia czyszczenia tuż przed wyrzuceniem elementów bezużytecznych.

Jaka jest różnica między final, wreszcie i finalize?

Główna różnica między final, wreszcie i finalize polega na tym, że final jest modyfikatorem dostępu, finale jest blokiem w obsłudze wyjątków, a finalize jest metodą klasy obiektu.

Czy można zastąpić metody final?

Nie, metod zadeklarowanych jako ostateczne nie można zastąpić ani ukryć.

Czy możemy użyć try bez catch?

Tak, możliwe jest użycie bloku try bez bloku catch , używając bloku końcowego . Jak wiemy, ostatni blok zostanie zawsze wykonany, nawet jeśli w bloku try wystąpi jakikolwiek wyjątek inny niż System.

Jakie są metody ostateczne?

Metod końcowych nie można zastąpić ani ukryć za pomocą podklas. Służą do zapobiegania nieoczekiwanemu zachowaniu podklasy modyfikującej metodę, która może mieć krytyczne znaczenie dla funkcji lub spójności klasy.

Czy konstruktor może być ostateczny?

Konstruktorzy NIGDY nie mogą zostać uznani za ostatecznych. Twój kompilator zawsze wyświetli błąd typu „końcowy modyfikator nie jest dozwolony”. Wersja final stosowana do metod oznacza, że ​​metody nie można zastąpić w podklasie. Konstruktory NIE są zwykłymi metodami.

Do czego służy słowo kluczowe last?

Słowo kluczowe last służy do tworzenia bloku kodu następującego po bloku try. Blok Final jest zawsze wykonywany niezależnie od tego, czy wystąpił wyjątek. Użycie bloku wreszcie umożliwia uruchomienie dowolnych instrukcji typu unwind, które chcesz wykonać, niezależnie od tego, co dzieje się w chronionym kodzie.

Jaki w końcu pożytek?

Blok finalny w Javie to blok używany do wykonywania części kodu, takich jak zamykanie połączenia i inne. Blok Final w Javie jest zawsze wykonywany niezależnie od tego, czy wyjątek został obsłużony, czy nie. Dlatego zawiera wszystkie niezbędne instrukcje, które należy wydrukować, niezależnie od tego, czy wystąpi wyjątek, czy nie.

Dlaczego metoda Finalize jest chroniona?

Dlaczego modyfikator dostępu metody finalize() jest chroniony? Dlaczego to nie może być publiczne? Nie jest publiczny, ponieważ nie powinien być wywoływany przez nikogo innego niż JVM. Jednak musi być chroniony, aby można go było zastąpić przez podklasy, które muszą zdefiniować dla niego zachowanie.

Czy metoda finalizacji jest zawsze wywoływana w Javie?

Metoda finalize jest wywoływana, gdy obiekt ma zostać usunięty. Może się to zdarzyć w dowolnym momencie po tym, jak kwalifikuje się do zbierania elementów bezużytecznych. Należy zauważyć, że jest całkowicie możliwe, że obiekt nigdy nie zostanie usunięty (i dlatego finalize nigdy nie jest wywoływane).

Jaka jest różnica między rzutem a rzutem?

Słowo kluczowe Throw służy do celowego zgłaszania wyjątku. Słowo kluczowe rzuca służy do deklarowania jednego lub większej liczby wyjątków, oddzielonych przecinkami. Podczas korzystania z rzutu zgłaszany jest tylko jeden wyjątek.

Jaka jest różnica między słowami kluczowymi „try catch” i „w końcu”?

Są to dwie różne koncepcje: blok catch jest wykonywany tylko wtedy, gdy w bloku try wystąpi wyjątek. Blok Final jest zawsze wykonywany po bloku try(-catch), niezależnie od tego, czy został zgłoszony wyjątek, czy nie.

Czy możemy użyć wreszcie bez próby w Javie?

Blok Final musi być powiązany z blokiem try, nie można go użyć w końcu bez bloku try. Musisz umieścić w tym bloku te instrukcje, które muszą być zawsze wykonane.

Czy możemy odziedziczyć ostateczną metodę?

Czy ostateczna metoda jest dziedziczona? Tak, ostateczna metoda jest dziedziczona, ale nie można jej zastąpić.

Której metody nie można zastąpić?

Nie możemy przesłonić metod statycznych, ponieważ przesłanianie metod opiera się na dynamicznym łączeniu w czasie wykonywania, a metody statyczne są powiązane przy użyciu statycznego łączenia w czasie kompilacji. Dlatego przesłanianie metod statycznych nie jest możliwe.

Co się stanie, jeśli ostateczna metoda zostanie zastąpiona?

Ostateczna metoda zadeklarowana w klasie nadrzędnej nie może zostać przesłonięta przez klasę podrzędną. Jeśli spróbujemy zastąpić ostatnią metodę, kompilator zgłosi wyjątek w czasie kompilacji.

Czy słowo kluczowe final i metoda finalizacji działają tak samo?

Nie ma podobieństw w ich funkcjach, z wyjątkiem podobnych nazw. Ostatniego słowa kluczowego można używać z klasą, metodą lub zmienną w Javie. Klasy końcowej nie można rozszerzyć w Javie, metody końcowej nie można przesłonić ani zmodyfikować zmiennej końcowej.

Jakie jest słowo kluczowe super w Javie?

Słowo kluczowe super w Javie jest zmienną referencyjną używaną do odwoływania się do bezpośredniego obiektu klasy nadrzędnej. Za każdym razem, gdy tworzysz instancję podklasy, równolegle tworzona jest instancja klasy nadrzędnej, do której odwołuje się zmienna referencyjna super. Za pomocą słowa kluczowego super można bezpośrednio wywołać metodę klasy nadrzędnej.

Jaka jest różnica między statycznymi i końcowymi słowami kluczowymi?

Główna różnica między słowami kluczowymi static i final polega na tym, że słowo kluczowe static służy do zdefiniowania elementu klasy, którego można używać niezależnie od dowolnego obiektu tej klasy. Słowo kluczowe Final służy do deklarowania zmiennej stałej, metody, której nie można zastąpić, oraz klasy, której nie można dziedziczyć.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION