2013-07-29 3 views
1

Я относительно новичок в программировании на Java и имею небольшую проблему с объектно-ориентированным аспектом. Итак, давайте займемся этим! Недавно я написал программу, чтобы найти все простые числа между 0 и числом, x и где «i» - простое число. В этой программе две строки были такими же, как и следующие.Использование «нового» ключевого слова (Java)

BigInteger one = BigInteger.valueOf(i); 
    one = one.nextProbablePrime(); 

Цель этих строк, чтобы преобразовать целое число, т.е. в BigInteger использовать использовать метод nextProbablePrime. Оглядываясь назад, я вижу, что я не использовал ключевое слово «новый», и поэтому не создавал экземпляр класса BigInteger, но программа все еще составлялась и выполнялась без заминки. Почему программа способна использовать метод nextProbablePrime, скомпилировать и запустить, если экземпляр класса BigInteger не был создан? Кроме того, не будет создавать работу объекта в других ситуациях и с другими классами и методами. Кроме того, будет ли это препятствовать мне использовать полную функциональность класса BigInteger и считается ли это хорошей практикой программирования?

Я также переписал ему две строки кода из вышеперечисленного, в две строки кода, оставив остальную часть программы без изменений.

BigInteger one = new BigInteger(String.valueOf(i)); 
    one = one.nextProbablePrime(); 

Я изменил первую строку этих двух, чтобы включить использование слова «новое». Как я и ожидал, он бежал без недостатка. Возвращаясь к другим вопросам, какой из них лучше? Какой из них даст мне наибольшую функциональность, несмотря на класс или метод, который я использую, и какой из них больше считается хорошей практикой?

Подводя итоги, я задаю следующие вопросы: 1. Какой именно? 2. Какой из них будет работать во всех ситуациях, несмотря на класс или метод, который я использую? 3. Какой из них считается хорошей практикой программирования? 4. Как первый работает без создания объекта?

Быстрая ссылка на класс BigInteger, для тех, кто может захотеть взглянуть на него - here

+1

Кому бы ни было «-1» в моем посте, могу я спросить, почему вы это сделали? Это просто так, что я не буду делать ту же ошибку в следующий раз при публикации вопроса. – Novice

+0

Сделайте еще одну вещь. Из самого вопроса ясно, что вы не привязали исходный код классов, поэтому откройте любой класс, скажем BigInteger, eclipse попросит приложить источник, зайдите в свой установочный каталог Java, скажем: «C: \ Program Files (x86) \ Java \ jdk1.6.0_45" . Теперь для любых проблем в существующем коде/методе всегда открывайте класс и смотрите, что на самом деле происходит в фоновом режиме – Algorithmist

+0

, вероятно, bcoz длинного текста вашего вопроса. В будущем попробуйте сохранить свой вопрос простым, коротким и точным. так, как я этого не сделал) – Algorithmist

ответ

15

Вы сделал создать экземпляр класса BigInteger. Это просто, что ключевое слово new было использовано где-то внутри реализация метода BigInteger.valueOf.

BigInteger.valueOf, как правило, более эффективен. Он может использовать тот же объект BigInteger для некоторых значений i - возможно, 0, или, возможно, как Integer.valueOf(int), она идет от -128 до 128.

BigInteger.valueOf называется методом фабрики, и они часто рекомендуется. Среди прочего, заводские методы могут иметь имена, где конструкторы не могут; они больше контролируют их реализацию; есть много веских причин. Фактически, очень первый предложение в Эффективная Java - «Статические методы фабрики вместо конструкторов."

Если вы на самом деле посмотреть на source code из BigInteger.valueOf, вы можете видеть, что это то, что он делает: он проверяет, если он может повторно использовать постоянное значение - ZERO или небольшое положительное или отрицательное значение - и если это невозможно, это просто идет вперед и называет new BigInteger(value), хотя он использует внутренний закрытый конструктор, который принимает long, а не с помощью String.valueOf.

+1

Чтобы быть более точным, не глядя на него, метод 'public static BigInteger valueOf (String value)' вероятно, просто возвращает 'return new BigInteger (значение); ' –

+0

Также известен как [Factory method pattern] (https://en.wikipedia.org/wiki/Factory_method) :-) – Joey

+0

@ IngoBürk Это немного сложнее, чем это. – arshajii

1

Первый метод использует статический метод из BigInteger. Это было бы мое предпочтение, хотя как работы, так и оба делать то же самое.

new keywor d создает фактический экземпляр объекта в памяти. Поскольку метод BigInteger.valueOf(i); является статическим, ему не нужен экземпляр BigInteger (этот метод сам будет создавать для вас новый BigInteger).

0

Что вы имеете в виду здесь, является статическим методом класса BigInteger.

Этот метод будет возвращать экземпляр с автоматическим распределением BigInteger, поэтому Луи является правильным. new был использован для вас в методе valueOf.

0

Прежде всего, объект создается внутри (* возможно, не всегда).

Одна из причин, по которой метод valueOf() имеет возможность кэшировать BigInteger в небольшом диапазоне, чтобы не тратить ресурсы. (Создайте 1 объект со значением 5, а не тонны).

Вы должны создать объект при вызове new но вы можете повторно использовать старый объект в Условный оператор внутри метода

Оба варианта ОК. Но лучше использовать valueOf, потому что вы

  • не создавать ненужную строку.
  • имеет возможность cahce
1

Если вы посмотрите на документации:

общественности статической BigInteger valueOf (длинные вали)

Возвращает BigInteger, значение которого равно указанный длинный. Этот «статический заводский метод» предоставляется в качестве предпочтительного конструктора (long), поскольку он позволяет повторно использовать часто используемые BigIntegers .

Параметры: val - значение BigInteger для возврата. Возвращает: a BigInteger с указанным значением.

метод вы звоните возвращает новый экземпляр BigInteger

Здесь: http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

0

Чтобы ответить на все ваши вопросы:

  1. Оба 100% правильно.

  2. Оба будут работать в любой разумной ситуации.

  3. Первый способ, вероятно, имеет наименьшее издержки (отставание).

  4. Первый метод действительно создает объект внутри функции вы называете, что-то вроде этого:

    общественности статической BigInteger valueOf (длинный вал) { BigInteger BigInteger = новый BigInteger(); // сделайте что-нибудь, чтобы сделать val в BigInteger return bigInteger; }

Так к тому времени, он получает обратно к переменной он уже использовал new ключевое слово.

Смежные вопросы