Почему JavaFx PasswordField возвращает это содержимое как String?

В настоящее время я изучаю JavaFX, и я немного смущен тем, что PasswordField в JavaFX не имеет метода, который возвращает массив char или даже байтовый пароль. Вместо этого я должен использовать getText(), который возвращает строку.

Как вы можете прочитать здесь, swing решил пометить метод getText() как лишенный и попросит программиста вместо этого использовать getPassword(), который возвращает char массив.

Если я правильно понял, массивы char намного безопаснее, потому что вы можете полностью стереть их из ОЗУ, установив все значения равными 0. Тогда почему Oracle решил использовать строки в JavaFx? Есть ли новый способ удаления строк из кучи?

EDIT: насколько я знаю, char пароли гораздо более безопасны, потому что мы можем удалить их, когда захотим (перезаписываем их), что не относится к строкам.

Ответ 1

Действительно, массив строк использует массив char в своей основной реализации. Оба они хранятся в виртуальной машине, и обе они, возможно, небезопасны.

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

В чем причина? Единственный объект, который действительно может ответить, почему что-то происходит в Java, - это Oracle.

Ответ 2

То, что вы говорите, абсолютно правильно, вы не можете полагаться на сборщика мусора. Однако, имея char[], вы можете программно очищать символы, например: Arrays.fill(password, (char)0);

char[] все еще будет существовать в памяти, однако содержимое не прошло.

Я согласен с оригинальным автором вопроса, не имея метода char[] getPassword(), неприемлемого для поля пароля.