Importera paket i Java - prestanda?

Permalänk
Medlem

Importera paket i Java - prestanda?

Idag hamnade jag i en liten diskussion med min föreläsare. Hon hävdade att när man importerar klasser i Java så ska man specificera klassen man vill använda, inte bara paketet, ex:

import java.util.ArrayList;

Jag är säker på att jag läst nånstans (tror det var i Skansholms Java med Swing) att det går lika bra att importera hela paketet, alltså:

import java.util.*;

eftersom java bara importerar de klasser som används.

Finns säkert något java-snille här som kan avgöra diskussionen: vem har rätt?

Permalänk
Medlem

Högst ovetenskapligt test ger:

import java.util.ArrayList; public class testimport { public static void main(String... args) { ArrayList<String> a = new ArrayList<String>(); a.add("Hej"); a.add("Hopp"); for (String s : args) a.add(s); System.out.println(a); } }

Detta kompilerar till en classfil som är 648 byte stor. Om jag byter ut importen till

import java.util.*;

så blir filen lika stor (dvs 648 bytes).

Så det borde inte vara någon skillnad. Dock håller jag med din lärare, det är att föredra att explicit deklarera vilka klasser man använder. T.ex. för att undvika konflikter om du använder två bibliotek som har klasser med samma namn.

Jag gissar också att det är upp till kompileraren att göra optimeringarna. Jag använder mig av

java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

andra kompilerare kanske inte optimerar på samma sätt...

Permalänk
Medlem
Skrivet av Amöban:

Idag hamnade jag i en liten diskussion med min föreläsare. Hon hävdade att när man importerar klasser i Java så ska man specificera klassen man vill använda, inte bara paketet, ex:

import java.util.ArrayList;

Jag är säker på att jag läst nånstans (tror det var i Skansholms Java med Swing) att det går lika bra att importera hela paketet, alltså:

import java.util.*;

eftersom java bara importerar de klasser som används.

Finns säkert något java-snille här som kan avgöra diskussionen: vem har rätt?

Det är noll prestandaskillnad vid runtime och, om jag ska dra till med något jag inte har den ringaste koll på, kanske en tiondels sekund längre kompileringstid om man importar ett helt paket.

Den enda skillnaden är att det lokala namespacet blir mer upptaget om man importerar hela paket.

Skrivet av erifri:

Jag gissar också att det är upp till kompileraren att göra optimeringarna. Jag använder mig av

java version "1.6.0_26" Java(TM) SE Runtime Environment (build 1.6.0_26-b03) Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

andra kompilerare kanske inte optimerar på samma sätt...

Det behövs inga optimeringar på imports eftersom det ändå inte kompileras in i class-filen. Det som kan bli problem är, som sagts, namnkollisioner.

Om jag av någon anledning kodar utan ett komplett IDE med stöd för smarta imports så gör jag ofta hela paket-imports på exempelvis javax.swing och java.awt

edit: jisses, felciteringar och redigeringar. Nu är jag klar tror jag..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tack för svaren!

Men vad menar du med det här:

Skrivet av Teknocide:

Den enda skillnaden är att det lokala namespacet blir mer upptaget om man importerar hela paket.

Vad är ett namespace? Har hört ordet förr men aldrig förstått innebörden.

Permalänk
Medlem
Skrivet av Amöban:

Tack för svaren!

Men vad menar du med det här:

Vad är ett namespace? Har hört ordet förr men aldrig förstått innebörden.

Det låter krångligare än det är Namespace är den generella beteckningen på vad som i Java kallas paket, till exempel java.util.regex. Klasser är grupperade i paket och därav tillhör de ett namespace.

Poängen är att flera klasser kan ha samma namn men ligga i olika paket, exempelvis java.util.Date och SQL-representationen av datatypen Date.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det låter krångligare än det är Namespace är den generella beteckningen på vad som i Java kallas paket, till exempel java.util.regex. Klasser är grupperade i paket och därav tillhör de ett namespace.

Poängen är att flera klasser kan ha samma namn men ligga i olika paket, exempelvis java.util.Date och SQL-representationen av datatypen Date.

Skickades från m.sweclockers.com

Ok, hm... Då tror jag att jag är med. Har för mig att jag sett det i webbsidesammanhang också, typ "xml namespace". Vad innebär det i det sammanhanget?

Permalänk
Medlem
Skrivet av Amöban:

Ok, hm... Då tror jag att jag är med. Har för mig att jag sett det i webbsidesammanhang också, typ "xml namespace". Vad innebär det i det sammanhanget?

Det är samma sak fast i XML knyts ett namespace traditionellt till en URI. Exempelvis är XHTMLs namespace "http://www.w3.org/1999/xhtml" och anges vanligtvis med

. Här sätts default-namespace till xhtml, men XML tillåter även att man knyter flera namespaces till ett dokument:

<root xmlns:foo="http://www.glass.com/foo" xmlns:bar="http://www.tomat.com/bar"> <foo:fnutt>foo-fnutt</foo:fnutt> <bar:fnutt>bar-fnutt</bar:fnutt> </root>

Här kan du läsa mer om detta: http://en.wikipedia.org/wiki/XML_namespace

Visa signatur

Kom-pa-TI-bilitet