Несколько способов для избежания NullPointerException
👉 Используйте Optional из пакета java.util.
👉 При сравнении константы с переменной пришедшей из вне, нужно вызывать equals() на константе.
👉 А при сравнении двух переменных используйте java.util.Objects#equals.
👉 Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.
👉 Вызывайте методы equals() и equalsIgnoreCase() на известных объектах.
👉 Применяйте valueOf() вместо toString().
👉 Воспользуйтесь аннотациями @NotNull и @Nullable на основе IDE.
👉 При возврате из метода коллекций, не стоит возвращать null, лучше пустую коллекцию (java.util.Collections#emptyList).
Читать дальшеБиблиотека Retrofit
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
...
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
Call<List<Repo>> call = service.listRepos("JakeWharton");
List<Repo> repos = call.execute().body();
repos.forEach(System.out::println);
Retrofit - это библиотека для работы с HTTP-запросами в Java и Android, разработанная компанией Square. Основной целью Retrofit является упрощение выполнения сетевых запросов и преобразование HTTP-ответов в объекты Java. Retrofit использует аннотации Java для определения типа запроса, параметров, URL и других свойств.
...
Читать дальшеКонтракт метода hashCode
Для реализации хэш-функции в спецификации языка определены следующие правила:
- вызов метода hashCode() один и более раз над одним и тем же объектом должен возвращать одно и то же хэш-значение, при условии что поля объекта, участвующие в вычислении значения, не изменялись.
- вызов метода hashCode() над двумя объектами должен всегда возвращать одно и то же число, если эти объекты равны (вызов метода equals() для этих объектов возвращает true).
- хороший hashCode() должен распределять объекты по хеш-таблице равномерно, минимизируя количество коллизий (одинаковых хешей у разных объектов).
HttpClient
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
HttpClient представляет собой класс, введенный в Java 11, который предоставляет более современный и гибкий способ для выполнения HTTP-запросов и обработки HTTP-ответов. Он заменяет устаревший HttpURLConnection и предоставляет более удобный интерфейс для работы с сетевыми операциями.
HttpClient также поддерживает асинхронные операции, позволяя выполнять запросы асинхронно с использованием CompletableFuture.
Читать дальшеЦепочка методов (Method chaining)
public class Student {
String name;
int age;
String group;
public Student setName(String name) {
this.name = name;
return this;
}
public Student setAge(int age) {
this.age = age;
return this;
}
public Student setGroup(String group) {
this.group = group;
return this;
}
}
...
Student student = new Student()
.setName( "Piter")
.setAge(20)
.setGroup("CS-23");
Цепочка методов (Method chaining) — это общий синтаксис для нескольких вызовов методов в объектно-ориентированных языках программирования. Каждый метод возвращает объект, что позволяет объединить вызовы в один оператор без необходимости использования переменных для хранения промежуточных результатов.
...
Читать дальшеКласс Properties
String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "app.properties";
Properties appProps = new Properties();
appProps.load(new FileInputStream(appConfigPath));
System.out.println(appProps.getProperty("version")); // 1.0
System.out.println(appProps.getProperty("name")); // TestApp
В Java класс Properties представляет собой таблицу хэш-значений ключ-значение. Он является частью пакета java.util, и обычно используется для работы с конфигурационными файлами, настройками приложений и другими данными в формате ключ-значение.
...
Читать дальшеStream API. Метод dropWhile
// отбросить все первые отрицательные числа
List<Integer> digits = List.of(-2, -1, 0, 1, 2, 1, 0, -1, -2);
digits.stream()
dropWhile(d -> d < 0)
forEach(System.out::println);
// 0 1 2 1 0 -1 -2
Метод dropWhile был введен в интерфейсе Stream в JDK 9. Этот метод позволяет пропускать элементы в начале потока данных, пока они удовлетворяют определенному условию, и возвращает новый поток, начиная с первого элемента, который не соответствует условию.
...
Читать дальшеClass Loader (загрузчик классов)
public class CustomClassLoader extends ClassLoader {
@Override
public Class findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassFromFile(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassFromFile(String fileName) {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
fileName.replace('.', File.separatorChar) + ".class");
byte[] buffer;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream() ;
int nextValue = 0;
try {
while ( (nextValue = inputStream.read()) != -1 ) {
byteStream.write(nextValue);
}
} catch (IOException e) {
e.printStackTrace();
}
buffer = byteStream.toByteArray();
return buffer;
}
}
В Java, Class Loader (загрузчик классов) является частью Java Runtime Environment (JRE), которая ответственна за загрузку классов в виртуальную машину Java (JVM) во время выполнения программы. Class Loader осуществляет поиск и загрузку классов в память JVM по их именам.
...
Читать дальшеJIT-компилятор
На начальном этапе выполнения программы байт-код интерпретируется JVM. Это позволяет быстро запускать программы без необходимости предварительной компиляции в машинный код.
JIT-компилятор является ключевым элементом виртуальной машины Java (JVM). Он компилирует байт-код часто вызываемых методов в машинный код во время выполнения. Следовательно, он отвечает за оптимизацию программ Java.
...
Читать дальшеУправление доступом к членам класса

Модификаторы уровня доступа определяют, могут ли другие классы использовать определенное поле или вызывать определенный метод.
Существует 4 уровня доступа:
...
Читать дальше