Hej!
Som du själv nämner på första raden...
Om du har en metod som flera andra klasser anropar så kan det vara lämpligt att deklarera metoden static.
T ex:
Låt oss säga att klassen heter MyMath.
private final static double pi_value = 3.14;
public static double getPI()
{
return pi_value;
}
Titta på ovanstående metod. Låt oss säga att du har tre klasser som alla har att göra med det matematiska värdet PI.
Om all dessa klasser vill ha reda på värdet på pi så kan de anropa denna metod direkt genom
double val = MyMath.getPI(); // observera att klassen börjar med stor bokstav och att variablen pi_value är static.
Om du inte gjorde metoden getPI() static så skulle varje klass vara tvungen att instantiera ett nytt objekt av klassen MyMath. Då skulle varje MyMath även innehålla en unik instans av variabeln pi_value. Detta är ju onödigt eftersom pi ändras ju inte.
Vad göra då? Jo, vi låter då variablen vara static, dvs det skapas bara en instans av den variablen, oavsett hur många MyMath klasser skapas. Alla MyMath objekt delar då på samma pi_value variabel.
Om vi då även deklarerar metoden som static så slipper alla anropande klass-objekt först skapa en ny MyMath objekt, bara för att komma åt metoden getPI();
Nu kan alla klasser enkelt komma åt metoden genom:
MyMath.getPI() som då returnerar värdet på pi_value.
Du frågar om vilka risker det finns när man flera användare anropar en och samma metod.
Ett tänkbart scenario där du kan få otrevliga resultat när olika klasser anropar på samma metod/variabel;
public static Vector names = new Vector();
names.add("olle");
names.add("kalle");
names.add("pelle");
Låt oss säga att vi har tre klasser som vill komma åt och ändra på denna Vector -> A, B och C.
- Klass A läser in Vectorn names.
- Klass B läser också in Vectorn names och lägger till namnet "ida".
- men innan klass B hinner lägga till namnet "ida" så läser klass C in samma Vector.
Men C kommer ju bara se tre namn, inte det fjärde, "ida", som klass B har eller lägger in. Eller rättare sagt, C hinner inte registrera ändringen. "Ida" finns där dock.
I en fler-trådad Java-program så kan olika trådar läsa och skriva till en statisk variabeln lite då och så. Ordningen de skriver och läser går vad jag vet itne med 100% säkerhet förutspå eller bestämma.
Om inläsningen av ett objekt tar en längre stund så kan en annan klass läsa innehållet ur en variabel, medan en annan klass fortfarande håller på att uppdatera samma variabel.
Värre kan det vara då en klass tar bort element ur Vectorn.
Om klass A försöker ta bort ett element som klass B sekunden(eller millisekunden) innan raderade. Då uppstår det fenomen att A tar bort nåt som längre inte finns. Visst enligt A så finns det där men B tog jo bort det redan. Då lär programmet kasta en NullPointerException eller ArrayIndexOutOfBoundsException.
Lösningen är att du använder dig utav synkroniserade metoder eller objekt.
Dvs om klass A håller på att läsa in och ändra på Vectorn så kan ingen annan klass läsa in Vectorn utan måste vänta på att klass A blir färdig.