Java: доступ к классу внутри пакета, какой способ лучше?

Если я получаю доступ к классу в пакете, используя полное имя, не импортируя его, экономит ли он память?

Использование полного имени класса:

java.lang.Math.sqrt(x);

Пакет импорта:

import java.lang.Math;

Math.sqrt(x);

что лучше: импортировать пакет или получить доступ, используя полное имя?

Благодарю вас..


person Jomia    schedule 20.03.2011    source источник


Ответы (5)


Нет разницы в производительности между импортом пакета и использованием полного имени класса. Директива import не преобразуется в байт-код Java, следовательно, это не влияет на производительность во время выполнения. Единственное отличие состоит в том, что это экономит ваше время, если вы используете импортированный класс несколько раз. Это полезно прочитать здесь

person Piyush Mattoo    schedule 20.03.2011

Нет, это не экономит память.

Также обратите внимание, что вам вообще не нужно импортировать Math. Все в java.lang импортируется автоматически.

Лучшим примером будет что-то вроде ArrayList

import java.util.ArrayList;
....
ArrayList<String> i = new ArrayList<String>();

Обратите внимание, что я специально импортирую ArrayList. я мог бы сделать

import java.util.*; 

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

person Brian Roach    schedule 20.03.2011
comment
+1. также лично мне нравится import java.io.*, потому что его классы имеют длинные необычные имена. точно так же я бы никогда не import java.util.* =) - person amara; 20.03.2011
comment
за исключением того, что ArrayList работает, только если вы также импортируете java.util.List, потому что java.util.ArrayList наследуется от java.util.List. Поправьте меня, если я ошибаюсь, я совершенно новичок в Java. - person Hillcow; 18.02.2019

Они эквивалентны. Доступ такой же.

Импорт — это просто соглашение, чтобы избавить вас от необходимости каждый раз вводить полностью разрешенное имя класса. Вы можете написать всю свою Java без использования импорта, если вы умеете быстро печатать вслепую.

Но нет никакой разницы в эффективности или загрузке классов.

person duffymo    schedule 20.03.2011

Как уже было сказано, во время выполнения разницы нет (в файле класса он всегда полностью квалифицирован, а после загрузки и связывания класса есть прямые указатели на упомянутый метод), а в пакете java.lang все автоматически импортируется, как есть все в текущем пакете.

Компилятору, возможно, придется искать на несколько микросекунд дольше, но это не должно быть причиной — решайте для удобочитаемости для читателей.

Кстати, если вы используете много статических методов (например, из Math), вы также можете написать

import static java.lang.Math.*;

а затем использовать

sqrt(x)

напрямую. Но делайте это только в том случае, если ваш класс насыщен математикой, и это действительно помогает удобочитаемости больших формул, поскольку читатель (как компилятор) сначала будет искать в том же классе и, возможно, в суперклассах. (Аналогичным образом это относится и к другим статическим методам и статическим переменным (или константам).)

person Paŭlo Ebermann    schedule 20.03.2011

Пакет импорта предназначен для лучшей читабельности;

Полностью квалифицированный класс должен использоваться в особых сценариях. Например, одно и то же имя класса в другом пакете или используйте отражение, например Class.forName().

person 卢声远 Shengyuan Lu    schedule 20.03.2011