Java: Достъп до клас в пакет, кой е по-добрият начин?

Ако имам достъп до клас в рамките на пакет, използвайки напълно квалифицирано име, без да го импортирам, дали спестява памет?

Използване на пълно квалифицирано име на клас:

java.lang.Math.sqrt(x);

Импортиран пакет:

import java.lang.Math;

Math.sqrt(x);

кой е по-добрият начин: импортиране на пакета или достъп чрез пълно квалифицирано име?

Благодаря ти..


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


Отговори (5)


Няма разлика в производителността между импортирането на пакета или използването на пълно квалифицирано име на клас. Директивата за импортиране не се преобразува в 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