Как добавить метод в существующий класс без замены этого класса?
tl; dr: Как добавить метод в существующий класс, не заменяя этот класс?
Описание:
Когда я запускаю следующую команду в JShell:
public class TestClass {}
выводится следующий вывод:
created class TestClass
Повторное выполнение этой команды дает следующий вывод:
modified class TestClass
Давайте создадим класс с одним методом, как показано ниже:
public class TestClass {
public static void testMethod1() {
System.out.println("In testMethod1");
}
}
Стоит отметить, что вывод немного отличается от перезаписи предыдущего класса:
replaced class TestClass
Бег testMethod1
заканчивается успешно и In testMethod1
печатается в консоли.
Теперь я хочу добавить новый метод к существующим TestClass
без потери testMethod1
, Итак, я запускаю следующий фрагмент:
public class TestClass {
public static void testMethod2() {
System.out.println("In testMethod2");
}
}
...а также testMethod1
потерян, потому что весь TestClass
был заменен.
Как я могу добавить новый метод в существующий класс, не перезаписывая его? Что делать, если я написал 10 методов? Должен ли я записывать существующие методы рядом с новым методом, который я хочу добавить в класс? Разве JShell не должен предлагать пользователю заменить класс в форме предупреждения?
Любые советы или помощь приветствуется.
2 ответа
JShell не может этого сделать, и я не думаю, что это будет тем, чего хочет большинство людей. Если вы хотите регулярно сливаться с существующим кодом, вы, вероятно, захотите использовать редактор, который сохраняет исходный код без изменений и компилирует ваш исходный код с нуля. JShell должен отслеживать все виды информации об исходном коде в дополнение к скомпилированному байтовому коду, чтобы учесть то, что вы хотите. Например, что произойдет, если вы добавите метод, который уже был реализован как метод моста, в результате определения универсального метода?
Причина, по которой сообщение отличается от замененного или измененного, заключается в том, что JShells использует HotSwap, который может применяться только тогда, когда класс не меняет свою форму, т.е. объявляет те же методы и поля с одинаковыми сигнатурами.
Как я могу добавить новый метод в существующий класс, не перезаписывая его?
Вы можете выполнить это с помощью
/edit
который открывает панель редактирования Jshell, где вы можете добавить новый метод и принять, чтобы обновить определение класса в вашем случае. Команды jshell также иллюстрируют несколько других атрибутов для редактирования нескольких фрагментов, используя их name
или же id
, Добавляем скриншот как это сделать:
Что делать, если я написал 10 методов? Должен ли я записывать существующие методы рядом с новым методом, который я хочу добавить в класс?
Такой вариант использования выглядит скорее для IDE, чем для jshell на основе REPL, и явно упоминается как нецелевая задача в jshell JEP#222: оболочка Java (цикл чтения-Eval-Print)
Из области видимости выходят графические интерфейсы и поддержка отладчика. JShell API предназначен для обеспечения функциональности JShell в IDE и других инструментах, но инструмент jshell не предназначен для IDE.
Разве JShell не должен предлагать пользователю заменить класс в форме предупреждения?
Будет ли второй @Elliot, как упомянуто в комментариях, по- видимому, пока нет. Хотя это звучит интересно, задайте вопрос ИМХО, но его следует в равной степени сопоставить с мыслями о его реализации, а не с падением производительности инструмента. Ответ @Rafael дает подсказку о поддержании таких издержек.