Avatar billede mortennobel Nybegynder
17. april 2005 - 18:40 Der er 15 kommentarer og
1 løsning

final keyword

Hmmm .... hvorfor er nedenstående program egentligt lovligt?

public class Test implements Runnable
{
  private final int i;
  public Test(int i)
  {
    Thread t = new Thread(this);
    t.start();
    try
    {
      Thread.sleep(5000);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }
    this.i = i;
    System.out.println("After is i:"+this.i);
  }
 

  public static void main(String[] args)
  {
    Test test = new Test(5);
  }

  public void run()
  {
    System.out.println("i is "+i);
  }
}
Avatar billede kalp Novice
17. april 2005 - 18:43 #1
hvorfor skulle den ikke være det?
Avatar billede mikkelbm Nybegynder
17. april 2005 - 18:43 #2
Fordi du ikke har givet 'i' en værdi da du erklærer den.
Avatar billede mikkelbm Nybegynder
17. april 2005 - 18:46 #3
Hvis du havde skrevet:

private final int i = 5;

havde:

this.i = i;

ikke været lovlig.
Avatar billede busschou Praktikant
17. april 2005 - 18:48 #4
Man må give en Final en værdi netop een gang
Avatar billede mortennobel Nybegynder
17. april 2005 - 18:52 #5
Jeg mener det er lidt underligt, fordi jeg tilgår i, før end den får tildelt værdien 5.
Derfor udskriver programmet.
i is 0
After is i:5
Hvilket jeg syntes er lidt sjovt, selvom i er final.
Avatar billede kalp Novice
17. april 2005 - 18:54 #6
den er automatisk 0
Avatar billede mikkelbm Nybegynder
17. april 2005 - 18:54 #7
En Integer / int har som default værdien 0
Avatar billede simonvalter Praktikant
17. april 2005 - 18:56 #8
ikke helt rigtigt at du må give en final værdi en gang.. den skal enten initaliseres direkte eller igennem en constructor. Det må ikke gøres igennem en metode.
Avatar billede simonvalter Praktikant
17. april 2005 - 19:15 #9
mystiske ting som f.eks det kan du altid finde svar på i java language specification

http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html

(hvis man da ved hvad man skal søge efter ;)

4.5.5 Initial Values of Variables
Every variable in a program must have a value before its value is used:
Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10):
* For type int, the default value is zero, that is, 0.


8.3.1.2 final Fields
A field can be declared final (§4.5.4). Both class and instance variables (static and non-static fields) may be declared final.

It is a compile-time error if a blank final (§4.5.4) class variable is not definitely assigned (§16.7) by a static initializer (§8.7) of the class in which it is declared.

A blank final instance variable must be definitely assigned (§16.8) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
Avatar billede simonvalter Praktikant
17. april 2005 - 19:23 #10
men helt sikkert, i ekstreme tilfælde hvor man er uopmærksom kan det vist foresage problemer.
Avatar billede simonvalter Praktikant
17. april 2005 - 20:07 #11
Hmm måske misforstår jeg det her men for mig lyder det som om det skulle være fixet i 1.5... hvordan forstår i det her?

"Final means final
The mechanism by which final fields could appear to change their value under the old memory model was outlined in Part 1 -- in the absence of synchronization, another thread could first see the default value for a final field and then later see the correct value.

Under the new memory model, there is something similar to a happens-before relationship between the write of a final field in a constructor and the initial load of a shared reference to that object in another thread. When the constructor completes, all of the writes to final fields (and to variables reachable indirectly through those final fields) become "frozen," and any thread that obtains a reference to that object after the freeze is guaranteed to see the frozen values for all frozen fields. Writes that initialize final fields will not be reordered with operations following the freeze associated with the constructor."

http://www-106.ibm.com/developerworks/java/library/j-jtp03304/
Avatar billede simonvalter Praktikant
17. april 2005 - 20:20 #12
"problemet" er noget du selv skal håndtere. For den nye java memmory model (jsr 133) siges der:

Initialization safety

The new memory model semantics also include a new guarantee of initialization safety for objects with final fields. As long as the object is constructed correctly, which means that a reference to the object is not published to other threads before the constructor completes, the values assigned to the final fields in the constructor will be visible to all other threads without synchronization. In addition, the visible values for any other object or array referenced (directly or indirectly, such as fields of objects referenced by a final field or elements of a final array) by those final fields will be at least as up to date as the final fields.

Så dit problem er at dit objekt ikke er "constructed correctly"

hvis jeg forstår det rigtigt :)
Avatar billede mikkelbm Nybegynder
17. april 2005 - 21:11 #13
Og der var ikke andre der havde svaret på spørgsmålet før Simon?
Avatar billede arne_v Ekspert
17. april 2005 - 21:11 #14
Du læser det helt korrekt.

Men jeg vil lige pinde det ud så der ikke ernogen tvivl.

pre Java 1.5 : ikke synchronized => andre tråde ser 0 eller 5 som det passer JVM'en

Java 1.5 : når constructor er afsluttet vil andre tråde altid se 5

Koden is spørgsmålet kan også give 0 - 5 med Java 1.5, fordi den begår den
"synd" at bruge this inden constructor er færdig.
Avatar billede kalp Novice
17. april 2005 - 21:22 #15
vi andre svarede åbenbart "forkert" hehe:)
Avatar billede simonvalter Praktikant
17. april 2005 - 21:30 #16
ikke forkert.. men det interessante er jo at det kan ske at en final kan have 2 værdier og hvorfor - et spørgsmål der stadig var delvist ubesvaret efter i havde svaret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester