JavaRush /Java блог /Random UA /Кава-брейк #93. Як працює клас String у Java. Дізнайтеся,...

Кава-брейк #93. Як працює клас String у Java. Дізнайтеся, як реалізувати веб-інтерфейс Java

Стаття з групи Random UA

Як працює клас String в Java

Джерело: DZone Нещодавно на форумі я натрапив на наступне запитання: “Скільки тут створюється об'єктів String ? Один чи два?”.
String langName = new String("Java");
Мені було цікаво, як на нього відповіли інші, знаючи, що це складне питання, особливо якщо хтось погано знає, як працює клас String в Java. І ось, я поринув у розділ коментарів. Кава-брейк #93.  Як працює клас String у Java.  Дізнайтесь, як реалізувати веб-інтерфейс на Java - 1На мій подив, серед коментаторів знайшлися люди, які обрали “Один” як правильну відповідь, але набагато більше людей відповіли “Два”. На якусь секунду я навіть почав сумніватися у своїх знаннях про Strings . Правильна відповідь все залежить від обставин. Питання недостатньо зрозуміле і залишає місце для дискусій. Я б переформулював це так:

1. Скільки об'єктів Java String створюється у пам'яті під час виконання цього оператора?

Відповідь одна.

Скільки об'єктів Java String залишиться у пам'яті після виконання цього оператора?

Відповідь – дві. Сподіваюся, невизначеність зникла, коли я перевірив дамп пам'яті програми з оператором, як у наведеному вище прикладі. Кава-брейк #93.  Як працює клас String у Java.  Дізнайтесь, як реалізувати веб-інтерфейс на Java - 2Дамп пам'яті програми на наведеному вище зображенні показує існування двох об'єктів String з однаковим вмістом. Це доводить, що виклик конструктора класу String і передача як аргумент рядкового літерала призводить до додавання двох об'єктів до купи пам'яті: один — у звичайній (не пул) пам'яті, а інший — у String Constant Pool (SCP) — області пам'яті, яка також є частиною купи. Складнощі починаються після додавання. Виклик конструктора завжди призводить до розміщення нового об'єкта в область, яка не є пулом. Але аргумент конструктора, який є рядковим літералом, також є об'єктом, і він створюється і зберігається в SCP під час завантаження класу за умови, що пул рядків не містить рядка з таким же вмістом. У Специфікації мови Java зазначено, що “рядкові літерали – чи, у більш загальному сенсі, рядки (Strings), які є значеннями константних виразів (§15.28), – “інтернуються” для спільного використання унікальних екземплярів (instances) із застосуванням методу String . intern ”. Оскільки рядок у Java є буквальним і, отже, представляє значення константного виразу, він об'єднується в пул. Щоб зробити це ще очевиднішим, давайте перепишемо код, представлений на початку статті, таким чином:
String java = "Java";
String langName = new String(java);
А тепер повернемось до основного питання. Чи буде наступний оператор створювати один або два об'єкти String :
String langName = new String("Java");
Щоб відповісти на це питання та усунути будь-які підозри, давайте подивимося на байт-код основного методу:
public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    NEW java/lang/String
    DUP
    LDC "Java"
    INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
    ASTORE 1

   L1
    LINENUMBER 14 L1
   FRAME APPEND [java/lang/String]
    GOTO L1

   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
    MAXSTACK = 3
    MAXLOCALS = 2
У рядку 6 можна побачити команду LDC (Load Constant). Вона завантажує елемент з пулу констант рядків у стек. Це означає, що на момент виклику конструктора літерал Java, який також є об'єктом, вже був доданий у пул. Це сталося під час завантаження класу. Таким чином, виклик конструктора класу String з рядковим літералом створює лише один об'єкт і поміщає його в область пам'яті, що не відноситься до пулу.

Дізнайтеся, як реалізувати веб-інтерфейс Java

Джерело: Dev.to Світ JavaScript пропонує корисні та забавні веб-фреймворки, в цьому немає жодних сумнівів. Для Java-розробників є цікава альтернатива фреймворк Vaadin з відкритим вихідним кодом. З його допомогою можна легко реалізувати графічний інтерфейс користувача (GUI) для web, використовуючи тільки мову програмування Java і нічого більше. Не потрібно писати рядки HTML або JavaScript. Одна картинка коштує тисячі слів: Кава-брейк #93.  Як працює клас String у Java.  Дізнайтесь, як реалізувати веб-інтерфейс на Java - 3

Як працює Vaadin?

Зліва на скріншоті ви бачите клас Java. Цей код працює на сервері, наприклад, Apache Tomcat, Eclipse Jetty або будь-якому іншому контейнері сервлетів. Ви можете використовувати API, що надається платформою, для створення компонентів інтерфейсу користувача (UI), таких як текстові поля, поля зі списком (combo boxes), таблиць даних (data grids), засоби вибору дати, поля для завантаження та багато інших. Ви можете комбінувати ці компоненти для створення подання (також відомого як page або UI), використовуючи макети для розміщення компонентів інтерфейсу користувача (UI) по вертикалі, горизонталі або будь-яким іншим способом з використанням CSS. У попередньому прикладі ми створабо TextField і Button , додавши їх до VerticalLayout . Коли подання буде готове, ви можете відкрити його через URL-адресау, використовуючи анотацію @Route . У цьому прикладі ми зробабо його доступним на http://localhost:8080/hello, використовуючи @Route("hello") . Програма Vaadin — це веб-додаток на Java. Фреймворк надає Servlet реалізацію ( VaadinServlet ), яка обробляє HTTP-запити та відповіді за вас. Цей сервлет сканує класи Java, позначені анотацією @Route , щоб відобразити правильну виставу в браузері. При першому запиті Vaadin-програми Vaadin відповідає полегшеним файлом JavaScript, який служить клієнтським двигуном. Цей двигун піклується про обробку подій у браузері та надсилання їх на сервер у вигляді повідомлень JSON. Об'єкт VaadinServlet обробляє запити і повертає відповіді JSON механізму на стороні клієнта. Потім движок використовує це повідомлення для оновлення елементів на сторінці, які необхідно оновити, якщо є. Vaadin використовує HTTP-сесію для зберігання дерева компонентів, яке містить стан інтерфейсу користувача. Такі речі, як компоненти, формують уявлення та їх стани (enabled/disabled, caption, value та ін.). Це все забезпечує рівень безпеки, про який варто згадати. Оскільки логіка інтерфейсу користувача знаходиться на сервері, зловмисникам вона не доступна. Перевірки виконуються на сервері. Наприклад, якщо Button відключений за допомогою setEnabled(false) , то це не просто косметична функція в браузері - сервер не запускатиме яку-небудь логіку в прослуховувачах кліків (click listeners), доданих до неактивної кнопки, що не дозволяє зловмисникам використовувати інструменти розробника в браузер для зміни включеного стану або виклику VaadinServlet для імітації натискання на мишу (click event).

Чи можна використовувати Vaadin безкоштовно?

Так. Vaadin – це середовище з відкритим вихідним кодом, опубліковане під ліцензією Apache License 2.0. Вам не потрібно нічого купувати, щоб створювати на ньому повноцінні веб-програми. Є комерційні компоненти, які підвищують продуктивність, але вони є обов'язковими. Наприклад, є візуальний дизайнер та компонент CRUD, які допоможуть вам створювати уявлення ще швидше. Ви можете скуштувати ці компоненти безкоштовно перед оформленням передплати.

Чи є Vaadin заміною JSP та JSF?

Так. Його можна використовувати як заміну JSP, JSF і навіть фреймворк JavaScript, таким як Angular. Багато клієнтів Vaadin успішно перейшли з цих технологій на Vaadin.

Чи є у Vaadin підтримка Spring та Jakarta EE?

Так. Vaadin має офіційну інтеграцію зі Spring і Jakarta EE (раніше Java EE). Ви можете додати Vaadin в залежності від створення нового проекту Spring Boot за допомогою Spring Initializr. Для Jakarta EE можна завантажити простий приклад Hello, World, в якому використовується Jakarta EE. На момент написання цієї статті підтримується лише Jakarta EE версії 8.

Хто використовує Vaadin?

Багато компаній зі списку Fortune 500 використовують Vaadin, а також успішні стартапи та понад 200 тисяч розробників у всьому світі. Ознайомтеся з інструкцією з швидкого запуску та іншою документацією щодо Vaadin.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ