Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Что такое finalize()? Зачем он нужен?

Через вызов метода finalize() (который наследуется от java.lang.Object) JVM реализуется функциональность аналогичная функциональности деструкторов в С++, используемых для очистки памяти перед возвращением управления операционной системе. Данный метод вызывается при уничтожении объекта сборщиком мусора (garbage collector) и переопределяя finalize() можно запрограммировать действия необходимые для корректного удаления экземпляра класса - например, закрытие сетевых соединений, соединений с базой данных, снятие блокировок на файлы и т.д.

После выполнения этого метода объект должен быть повторно собран сборщиком мусора (и это считается серьезной проблемой метода finalize() т.к. он мешает сборщику мусора освобождать память). Вызов этого метода не гарантируется, т.к. приложение может быть завершено до того, как будет запущена сборка мусора.

Объект не обязательно будет доступен для сборки сразу же - метод finalize() может сохранить куда-нибудь ссылку на объект. Подобная ситуация называется «возрождением» объекта и считается антипаттерном. Главная проблема такого трюка - в том, что «возродить» объект можно только 1 раз.

Пример:

public class MainClass {
public static void main(String args[]) {
TestClass a = new TestClass();
a.a();
a = null;
a = new TestClass();
a.a();
System.out.println("!!! done");
}
}



public class TestClass {
public void a() {
System.out.println("!!! a() called");
}

@Override
protected void finalize() throws Throwable {
System.out.println("!!! finalize() called");
super.finalize();
}
}


Так как в данном случае сборщик мусора может и не быть вызван (в силу простоты приложения), то результат выполнения программы с большой вероятностью будет следующий:

!!! a() called
!!! a() called
!!! done


Теперь несколько усложним программу, добавив принудительный вызов Garbage Collector:

public class MainClass {
public static void main(String args[]) {
TestClass a = new TestClass();
a.a();
a = null;
System.gc(); // Принудительно зовём сборщик мусора
a = new TestClass();
a.a();
System.out.println("!!! done");
}
}


Как и было сказано ранее, Garbage Collector может в разное время отработать, поэтому результат выполнения может разниться от запуска к запуску.
Вариант а:

!!! a() called
!!! a() called
!!! done
!!! finalize() called


Вариант б:

!!! a() called
!!! a() called
!!! finalize() called
!!! done


#java #finalize #gc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
🔗 Разница между final, finally и finalize

Эти три похожих термина часто путают в Java, но у каждого из них свое назначение.

1️⃣ final ключевое слово для объявления:

• Констант (переменные, которые нельзя изменить).
• Методов (которые нельзя переопределить).
• Классов (которые нельзя наследовать).

2️⃣ finally блок, используемый с try-catch для выполнения кода независимо от того, было ли выброшено исключение.

3️⃣ finalize метод, вызываемый сборщиком мусора перед удалением объекта. Используется редко, так как считается устаревшим.

Пример:
final int a = 10;

try {
System.out.println(a);
} finally {
System.out.println("This always executes!");
}


💡 Совет: Используйте final для повышения читаемости кода, а finally для освобождения ресурсов. Метод finalize лучше избегать.

#java #final #finally #finalize
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
🛠 Object.finalize() устарел! Как правильно освобождать ресурсы?

Метод finalize() объявлен устаревшим в Java 9 и удалён в Java 18, так как он ненадёжный и медленный.

📌 Как освобождать ресурсы правильно?

🟢 Используйте try-with-resources для Closeable объектов:
try (FileInputStream fis = new FileInputStream("file.txt")) {
// Работа с файлом
}


🟢 Для кастомных классов используйте AutoCloseable:
class MyResource implements AutoCloseable {
@Override
public void close() {
System.out.println("Ресурс закрыт");
}
}


💡 Совет: Если ваш объект использует ресурсы (файлы, сокеты, соединения) – реализуйте AutoCloseable.

#java #finalize #autocloseable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍121