но они ничего не делают (не присваиваются какой-либо переменной)
Насколько знает компилятор, у них могут быть побочные эффекты (например, печать чего-либоили установка поля) и в этом случае они должны быть выполнены.Если бы они были inline
, компилятор мог бы исключить их, как упоминает ответ Джоша, после вставки.Но это не так, поэтому компилятор не может полагаться на свои определения (в отличие от сигнатур): во время выполнения может существовать другой JAR, содержащий эти методы и определяющий их с побочными эффектами.
Но JIT, скорее всего, встроит их, а затем устранит, если вы запустите этот код достаточно времени;просто не сразу.
В принципе могут быть контракты , объявляющие эти методы чистыми, и тогда компилятор может их устранить.Но текущие контракты не поддерживают это, насколько я знаю.