Это не совсем отвечает на вопрос, но для некоторых случаев использования (например, если вы в основном пытаетесь применить «проектирование по контракту») это может быть достаточно хорошим и более эффективным. В других случаях это не сработает и может оказаться гораздо менее эффективным.
Во время вашего конструктора сохраните хеш-код ByteBuffer
final int originalBBHashCode = byteBuffer.hashCode ();
Затем, в нескольких критических местах в вашем коде, где вы хотите убедиться, что ByteBuffer не изменился, убедитесь, что byteBuffer.hashCode () == originalBBHashCode. Если нет, бросьте исключение. Честно говоря, у меня возникнет соблазн сгенерировать исключение ConcurrentModificationException, поскольку именно такое поведение вы имитируете, но YMMV.