Краткий ответ: все длинные вписываются в 18 цифр. Так что, если вы знаете, что нет ведущих нулей, просто проверьте x.length
Недостатком является то, что некоторые 19-значные числа являются действительными long, а именно те, которые меньше, чем, я полагаю, доходит, 9223372036854775807. Поэтому, если вы хотите быть по-настоящему точным, вы должны сказать, что длина> 19 плохо, длина <19 - это хорошо, длина == 19, вам нужно проверять цифру за цифрой. В зависимости от того, что вы делаете, отклонение подмножества чисел, которые действительно будут работать, может быть приемлемым. </p>
Как и предполагали другие, главный вопрос: зачем ты это делаешь? Если это какое-то преобразование данных, когда вы получаете числа в виде цепочки цифр из какого-то внешнего источника, и вам нужно преобразовать это в длинный, крутой. Если вы пытаетесь создать класс для обработки чисел, больших, чем поместится в long, то, что вы делаете, является неэффективным и ненужным. Неэффективно, потому что вы можете упаковать в int намного больше одной десятичной цифры, и это даст все виды улучшения памяти и производительности. Нет необходимости, потому что BigInteger уже делает это. Почему бы просто не использовать BigInteger?
Конечно, если это домашнее задание, это другая история.