Pascal4eg / Java

 Java | Фишки и трюки

Immutable Classes (неизменяемые классы)

Неизменяемость — это характеристика объектов Java, которая делает их неизменными для будущих изменений после их инициализации. Его внутреннее состояние невозможно никак изменить. Чтобы изменить состояние, мы должны создать новую копию такого объекта с предполагаемыми изменениями.

Возьмем пример класса java.lang.String, который является неизменяемым классом. После создания строки мы не сможем изменить содержимое этой строки. Каждый общедоступный API в классе String возвращает новую строку с измененным содержимым. Исходная строка всегда остается неизменной.

...

Читать дальше

Arrays.toString() и Arrays.deepToString()

Double[] doubleArray = new Double[] {11.0, 45.55, 83.4};
System.out.println(Arrays.toString(doubleArray));
// [11.0, 45.55, 83.4]

String[] stringArray = new String[] {"John", "Mary", "Bob"};
System.out.println(Arrays.toString(stringArray));
// [John, Mary, Bob]

String[][] deepArray = new String[][] {{"John", "Mary"}, {"Alice", "Bob"}};
System.out.println(Arrays.deepToString(deepArray) );
// [[John, Mary], [Alice, Bob]]

В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().

Но обычно нам на самом деле нужно что бы напечаталось содержимое массива....

Читать дальше

Принцип программирования KISS

Принцип программирования KISS - это акроним, который расшифровывается как "Keep It Simple, Stupid" или более корректно "Keep It Short and Simple". Этот принцип представляет собой философию, которая подразумевает, что программное обеспечение должно быть создано и поддерживаться с максимальной простотой, чтобы быть более надежным, легко понимаемым и легко изменяемым.

...

Читать дальше

Способы передачи параметров в Java

public class PassBy {
    public static void main(String[] args) {
        int i = 0;
        System.out.println(i); // 0
        changeValue(i);
        System.out.println(i); // 0

        SuperInt si = new SuperInt(0);
        System.out.println(si.i); // 0
        changeValue(si);
        System.out. println(si.i); // 10
    }

    public static void changeValue(int val) {
        val = 10;
    }

    public static void changeValue(SuperInt val) {
        val.i = 10;
    }

    static class SuperInt {
        public int i;
        public SuperInt(int i) {
            this.i = i;
        }
    }
}

В языках программирования существует два основных способа передачи параметров в методы (или функции) — "по значению" и "по ссылке". Эти методы определяют, каким образом изменения, внесенные в параметр внутри метода, влияют на исходное значение аргумента, переданного методу. Рассмотрим оба способа более подробно.

...

Читать дальше

StringJoiner

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.setEmptyValue( "No items");
System.out.println(sj.toString()); // No items

sj.add("Apple").add("Banana").add("Cherry");
System.out.println(sj.toString()); // [Apple, Banana, Cherry]

StringJoiner - это класс, который предназначен для объединения строк с использованием разделителя между ними. Этот класс был введен в Java 8 в пакете java.util. Он облегчает создание текстовых последовательностей, объединяя строки и вставляя разделители между ними.

...

Читать дальше

Скачать файл используя Java NIO

// Download file from FILE_URL to FILE_NAME
URL url = new URL(FILE_URL);
try (ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
     FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
     FileChannel fileChannel = fileOutputStream.getChannel()) {
    fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
} catch (IOException e) {
    throw new RuntimeException(e);
}

Пакет Java NIO предлагает возможность передавать байты между двумя каналами без их буферизации в памяти приложения.

...

Читать дальше

ACID (Atomicity, Consistency, Isolation, Durability)

ACID (Atomicity, Consistency, Isolation, Durability) - это набор свойств, которые определяют стандарты для транзакций в базах данных. Эти свойства обеспечивают надежность и целостность данных в базе данных, даже в случае сбоев системы или непредвиденных ситуаций. Давайте рассмотрим каждое из этих свойств более подробно:

...

Читать дальше

MinIO - хранилище данных

MinioClient minioClient = MinioClient.builder()
        .endpoint(minioUrl)
        .credentials(minioLogin, minioPassword)
        .build();
// Save file
ByteArrayInputStream bais = new ByteArrayInputStream(data);
minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioBucket)
                .object(fileName)
                .stream(bais, data.length, -1).build( ));
// Get file
InputStream inputStream = minioClient.getobject(
        GetObjectArgs.builder()
                .bucket(minioBucket)
                .object(fileName)
                .build());
// Delete file
minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket(minioBucket)
                .object (fileName)
                .build());

Часто в Java-приложении есть необходимость хранить файлы. И если приложение состоит из нескольких микросервисов, которым нужен доступ к файлам, то не обойтись без централизованного файлового хранилища. Одним из таких хранилищ является MinIO.

MinIO - это open source хранилище данных, совместимое с Amazon S3. Он обеспечивает отказоустойчивость, масштабируемость, шифрование данных и предоставляет богатые клиентские библиотеки для интеграции в приложения.

MinIO становится популярным выбором для хранения и управления данными благодаря своей гибкости и совместимости с Amazon S3, что делает его подходящим для широкого спектра приложений, от простых хранилищ данных до сложных облачных сценариев.

Читать дальше

QueryDSL

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager em = emf.createEntityManager();
JPAQueryFactory queryFactory = new JPAQueryFactory(JPQLTemplates.DEFAULT, em) ;
QPerson person = Person.person;
List<Person> persons = queryFactory.selectFrom(person)
        .where(
            person.firstName.eq("John"),
            person.lastName.eq("Doe"))
        .orderBy(
            person.lastName.asc(),
            person.firstName.desc())
        .fetch();

QueryDSL — это мощный и чрезвычайно гибкий инструмент для работы с БД и просто подарок для Java-разработчиков, которые не очень хорошо разбираются в SQL (или совсем не разбираются), поскольку позволяет работать с БД при помощи привычного объектного представления сущностных зависимостей.

...

Читать дальше

🐳 Запуск java приложения в Docker

Dockerfile

Для запуска приложения в докере понадобится установленный Docker и приложение собранное в jar файл.

Для создания docker образа (image), на основе которого будет создаваться контейнер с вашим приложением, нужен файл с именем Dockerfile.

...

Читать дальше