How to prevent changing the value of variableConvert an array of primitive longs into a List of LongsIs Java “pass-by-reference” or “pass-by-value”?How do I efficiently iterate over each entry in a Java Map?Sort a Map<Key, Value> by valuesHow do I call one constructor from another in Java?How do I read / convert an InputStream into a String in Java?How do I generate random integers within a specific range in Java?How to get an enum value from a string value in Java?How do I determine whether an array contains a particular value in Java?How do I convert a String to an int in Java?How do I fix android.os.NetworkOnMainThreadException?

How would photo IDs work for shapeshifters?

LWC and complex parameters

Uplifted animals have parts of their "brain" in various locations of their body. Where?

How to manage monthly salary

Typesetting a double Over Dot on top of a symbol

COUNT(*) or MAX(id) - which is faster?

Is this food a bread or a loaf?

Is there any use for defining additional entity types in a SOQL FROM clause?

What is the command to reset a PC without deleting any files

Is ipsum/ipsa/ipse a third person pronoun, or can it serve other functions?

Landing in very high winds

Extreme, but not acceptable situation and I can't start the work tomorrow morning

What does 'script /dev/null' do?

Are white and non-white police officers equally likely to kill black suspects?

Can I find out the caloric content of bread by dehydrating it?

How can I plot a Farey diagram?

Calculate Levenshtein distance between two strings in Python

What is it called when one voice type sings a 'solo'?

Short story: alien planet where slow students are executed

Can I legally use front facing blue light in the UK?

Manga about a female worker who got dragged into another world together with this high school girl and she was just told she's not needed anymore

Is it legal to have the "// (c) 2019 John Smith" header in all files when there are hundreds of contributors?

Find the number of surjections from A to B.

Why do we use polarized capacitors?



How to prevent changing the value of variable


Convert an array of primitive longs into a List of LongsIs Java “pass-by-reference” or “pass-by-value”?How do I efficiently iterate over each entry in a Java Map?Sort a Map<Key, Value> by valuesHow do I call one constructor from another in Java?How do I read / convert an InputStream into a String in Java?How do I generate random integers within a specific range in Java?How to get an enum value from a string value in Java?How do I determine whether an array contains a particular value in Java?How do I convert a String to an int in Java?How do I fix android.os.NetworkOnMainThreadException?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








12















I am a beginner in Java. When developing a program, I created an object with a constructor with variables as arguments. But when I change the value of the variable after creating the object, my object has the second value instead of the first one. I don't want my object to change the value. What do I do?



public class Person 

public Person(int[] arrayTest)
this.arrayTest = arrayTest;


public int[] getArray()
return this.arrayTest;


public boolean canHaveAsArray(int[] arrayTest)
return true;


private int[] arrayTest = new int[2];

public static void main(String[] args)
int[] array = new int[] 5, 10;
Person obj1 = new Person(array);
array[0] = 20;
System.out.println(Arrays.toString(obj1.getArray()));




My output should be [5, 10], but instead, I am getting [20,10]. I need to get [5,10] even when I change an element of the array as shown above. What should I do?










share|improve this question






























    12















    I am a beginner in Java. When developing a program, I created an object with a constructor with variables as arguments. But when I change the value of the variable after creating the object, my object has the second value instead of the first one. I don't want my object to change the value. What do I do?



    public class Person 

    public Person(int[] arrayTest)
    this.arrayTest = arrayTest;


    public int[] getArray()
    return this.arrayTest;


    public boolean canHaveAsArray(int[] arrayTest)
    return true;


    private int[] arrayTest = new int[2];

    public static void main(String[] args)
    int[] array = new int[] 5, 10;
    Person obj1 = new Person(array);
    array[0] = 20;
    System.out.println(Arrays.toString(obj1.getArray()));




    My output should be [5, 10], but instead, I am getting [20,10]. I need to get [5,10] even when I change an element of the array as shown above. What should I do?










    share|improve this question


























      12












      12








      12


      1






      I am a beginner in Java. When developing a program, I created an object with a constructor with variables as arguments. But when I change the value of the variable after creating the object, my object has the second value instead of the first one. I don't want my object to change the value. What do I do?



      public class Person 

      public Person(int[] arrayTest)
      this.arrayTest = arrayTest;


      public int[] getArray()
      return this.arrayTest;


      public boolean canHaveAsArray(int[] arrayTest)
      return true;


      private int[] arrayTest = new int[2];

      public static void main(String[] args)
      int[] array = new int[] 5, 10;
      Person obj1 = new Person(array);
      array[0] = 20;
      System.out.println(Arrays.toString(obj1.getArray()));




      My output should be [5, 10], but instead, I am getting [20,10]. I need to get [5,10] even when I change an element of the array as shown above. What should I do?










      share|improve this question
















      I am a beginner in Java. When developing a program, I created an object with a constructor with variables as arguments. But when I change the value of the variable after creating the object, my object has the second value instead of the first one. I don't want my object to change the value. What do I do?



      public class Person 

      public Person(int[] arrayTest)
      this.arrayTest = arrayTest;


      public int[] getArray()
      return this.arrayTest;


      public boolean canHaveAsArray(int[] arrayTest)
      return true;


      private int[] arrayTest = new int[2];

      public static void main(String[] args)
      int[] array = new int[] 5, 10;
      Person obj1 = new Person(array);
      array[0] = 20;
      System.out.println(Arrays.toString(obj1.getArray()));




      My output should be [5, 10], but instead, I am getting [20,10]. I need to get [5,10] even when I change an element of the array as shown above. What should I do?







      java






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 30 at 16:17









      Peter Mortensen

      13.9k1987113




      13.9k1987113










      asked Mar 30 at 4:32









      OpheliaOphelia

      693




      693






















          6 Answers
          6






          active

          oldest

          votes


















          12














          Array is passed by reference in Java. If you pass the original array to the constructor of Person, you are passing the reference to the original array. So any change in arrayTest inside Person instance will reflect in original array(int[] array) and vice-versa.



          If you don't want to change the value of elements of original array in Person instance then you have two options:




          • You can modify the code in Person constructor to create a copy of original array using java.util.Arrays.copyOf method and then use that copy:



            public Person(int[] arrayTest) 
            this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);




          • Don't pass the original array to constructor, instead just send a copy of original array:



            Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));


          However, I would prefer first approach.






          share|improve this answer




















          • 2





            I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

            – LeoN
            Mar 30 at 6:43












          • On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

            – DreamConspiracy
            Mar 30 at 8:35


















          4














          There is no such thing as immutable (unchangeable) array in Java. The Java language does not support this, and neither does the JVM. You can't solve this at the language level.



          In general, the only way to prevent changes to an array is to not share the reference to the array with other code that might change it.



          In your example, you have what is known as a leaky abstraction. You are passing an array to your Person class, and the caller is keeping a reference to that array so that it can change it. To solve this, you can:



          • copy the array, and pass a reference to the copy, or

          • have the constructor (or a setter for the array attribute) make the copy.

          (See answer https://stackoverflow.com/a/55428214/139985 for example code.)



          The second alternative is preferable from an OO perspective. The Person class should be responsible for preserving its own internal state from interference ... if that is your design requirement. It should not rely on the caller to do this. (Even if the caller is technically part of the same class as is the case here.)






          share|improve this answer

























          • by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

            – Pac0
            Mar 30 at 17:43


















          1














          There is no unmodifiable array, but you can make an unmodifiable list:



          List<Integer> list = List.of(5, 10);


          You will have to change your code to use lists instead of arrays, but this is generally preferable anyway.




          If you already have an array of a non-primitive type, you can wrap it in an unmodifiable list, like so:



          List<Integer> list = Collections.unmodifiableList(Arrays.asList(array));


          However, while you can't change the list directly, changing the array will change the list. Moreover, this won't work on int[], but only on subclasses of Object[].






          share|improve this answer
































            0














            Instead of passing a copy of the array to the object, as others have suggested, I would recommend that the Person object's constructor should create a copy. Which means instead of,



            this.arrayTest = arrayTest;


            It should be



            this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length);


            This would allow the object to be defensive against malicious code trying to modify arrays after construction and validation by constructor. In fact most IDEs have analysis tools which will give you a warning against saving array reference.






            share|improve this answer






























              0















              In Java, objects/arrays are manipulated through reference variables#




              When a function is invoked with arrays as their arguments, only a reference to the array is passed. Therefore, when you mutate array array, the arrayTest field also get mutated as they are referring to the same address



              To override this behavior, you can create a copy of the array in your constructor using Object.clone() method like:



              public Person(int[] arrayTest) 
              this.arrayTest = arrayTest.clone();



              # Source: Wikipedia






              share|improve this answer
































                0














                As others have already pointed out: The array is passed as a reference to the Person. So changes that are later done to the array will be visible to the Person object. But that's only one half of the problem: You are not only passing a reference to the array to the constructor of the Person, you are also returning a reference from the getArray method.




                Generally speaking, and as StephenC already pointed out in his answer: One important aspect of Object-Oriented design is to properly manage the state space of objects. It should not be possible for users of a class to bring an object into any form of "inconsistent state".



                And this is difficult with plain primitive arrays. Consider the following pseudocode, referring to the class that you posted:



                int originalArray[] = new int[2];
                originalArray[0] = 12;
                originalArray[1] = 34;

                Person person = new Person(originalArray);
                int arrayFromPerson[] = person.getArray();

                originalArray[0] = -666; // Modify the original array
                System.out.println(arrayFromPerson[0]) // Prints -666 - this is unexpected!

                arrayFromPerson[1] = 12345678; // Modify the array from the person
                System.out.println(originalArray[1]) // Prints 12345678 - this is unexpected!


                Nobody knows who has a reference to the array, and nobody can verify or track that the contents of the array is not changed in any way. How critical this is becomes more obvious when you anticipate that the Person object will be used at different places, possibly even by multiple threads.



                Plain primitive arrays in Java do have their justification. But when they appear in the interface of a class (that is, in its public methods), they should be view with scrutiny.



                In order to be absolutely sure that nobody can interfere with the array that is stored in the Person object, you'd have to create defensive copies everywhere:



                public Person(int[] arrayTest) 
                this.arrayTest = arrayTest.clone(); // Store a clone of the array

                public int[] getArray()
                return this.arrayTest.clone(); // Return a clone of the array



                But this may be cumbersome. A more object-oriented solution could be to expose a "read-only view" on the state that is represented with the array. For example:



                public Person(int[] arrayTest) 
                this.arrayTest = arrayTest.clone(); // Store a clone of the array

                public int getArrayLength()
                return this.arrayTest.length;

                public int getArrayElement(int index)
                return this.arrayTest[index];



                (Of course, in practice, you'd name the methods accordingly, depending on what the array actually represents. For example, if it's the ages of the children of the person, you'd call the methods getNumChildren() and getAgeOfChild(int i) or so...)



                Another option how this can be solved is to expose an (unmodifiable) List view on the array. This can, for example, be done with the asUnmodifiableList method that is shown in this answer.






                share|improve this answer























                  Your Answer






                  StackExchange.ifUsing("editor", function ()
                  StackExchange.using("externalEditor", function ()
                  StackExchange.using("snippets", function ()
                  StackExchange.snippets.init();
                  );
                  );
                  , "code-snippets");

                  StackExchange.ready(function()
                  var channelOptions =
                  tags: "".split(" "),
                  id: "1"
                  ;
                  initTagRenderer("".split(" "), "".split(" "), channelOptions);

                  StackExchange.using("externalEditor", function()
                  // Have to fire editor after snippets, if snippets enabled
                  if (StackExchange.settings.snippets.snippetsEnabled)
                  StackExchange.using("snippets", function()
                  createEditor();
                  );

                  else
                  createEditor();

                  );

                  function createEditor()
                  StackExchange.prepareEditor(
                  heartbeatType: 'answer',
                  autoActivateHeartbeat: false,
                  convertImagesToLinks: true,
                  noModals: true,
                  showLowRepImageUploadWarning: true,
                  reputationToPostImages: 10,
                  bindNavPrevention: true,
                  postfix: "",
                  imageUploader:
                  brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                  contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                  allowUrls: true
                  ,
                  onDemand: true,
                  discardSelector: ".discard-answer"
                  ,immediatelyShowMarkdownHelp:true
                  );



                  );













                  draft saved

                  draft discarded


















                  StackExchange.ready(
                  function ()
                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55428172%2fhow-to-prevent-changing-the-value-of-variable%23new-answer', 'question_page');

                  );

                  Post as a guest















                  Required, but never shown

























                  6 Answers
                  6






                  active

                  oldest

                  votes








                  6 Answers
                  6






                  active

                  oldest

                  votes









                  active

                  oldest

                  votes






                  active

                  oldest

                  votes









                  12














                  Array is passed by reference in Java. If you pass the original array to the constructor of Person, you are passing the reference to the original array. So any change in arrayTest inside Person instance will reflect in original array(int[] array) and vice-versa.



                  If you don't want to change the value of elements of original array in Person instance then you have two options:




                  • You can modify the code in Person constructor to create a copy of original array using java.util.Arrays.copyOf method and then use that copy:



                    public Person(int[] arrayTest) 
                    this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);




                  • Don't pass the original array to constructor, instead just send a copy of original array:



                    Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));


                  However, I would prefer first approach.






                  share|improve this answer




















                  • 2





                    I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                    – LeoN
                    Mar 30 at 6:43












                  • On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                    – DreamConspiracy
                    Mar 30 at 8:35















                  12














                  Array is passed by reference in Java. If you pass the original array to the constructor of Person, you are passing the reference to the original array. So any change in arrayTest inside Person instance will reflect in original array(int[] array) and vice-versa.



                  If you don't want to change the value of elements of original array in Person instance then you have two options:




                  • You can modify the code in Person constructor to create a copy of original array using java.util.Arrays.copyOf method and then use that copy:



                    public Person(int[] arrayTest) 
                    this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);




                  • Don't pass the original array to constructor, instead just send a copy of original array:



                    Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));


                  However, I would prefer first approach.






                  share|improve this answer




















                  • 2





                    I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                    – LeoN
                    Mar 30 at 6:43












                  • On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                    – DreamConspiracy
                    Mar 30 at 8:35













                  12












                  12








                  12







                  Array is passed by reference in Java. If you pass the original array to the constructor of Person, you are passing the reference to the original array. So any change in arrayTest inside Person instance will reflect in original array(int[] array) and vice-versa.



                  If you don't want to change the value of elements of original array in Person instance then you have two options:




                  • You can modify the code in Person constructor to create a copy of original array using java.util.Arrays.copyOf method and then use that copy:



                    public Person(int[] arrayTest) 
                    this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);




                  • Don't pass the original array to constructor, instead just send a copy of original array:



                    Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));


                  However, I would prefer first approach.






                  share|improve this answer















                  Array is passed by reference in Java. If you pass the original array to the constructor of Person, you are passing the reference to the original array. So any change in arrayTest inside Person instance will reflect in original array(int[] array) and vice-versa.



                  If you don't want to change the value of elements of original array in Person instance then you have two options:




                  • You can modify the code in Person constructor to create a copy of original array using java.util.Arrays.copyOf method and then use that copy:



                    public Person(int[] arrayTest) 
                    this.arrayTest = java.util.Arrays.copyOf(arrayTest, arrayTest.length);




                  • Don't pass the original array to constructor, instead just send a copy of original array:



                    Person obj1 = new Person(java.util.Arrays.copyOf(array, array.length));


                  However, I would prefer first approach.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Mar 30 at 6:35

























                  answered Mar 30 at 4:40









                  Aniket SahrawatAniket Sahrawat

                  6,62221340




                  6,62221340







                  • 2





                    I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                    – LeoN
                    Mar 30 at 6:43












                  • On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                    – DreamConspiracy
                    Mar 30 at 8:35












                  • 2





                    I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                    – LeoN
                    Mar 30 at 6:43












                  • On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                    – DreamConspiracy
                    Mar 30 at 8:35







                  2




                  2





                  I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                  – LeoN
                  Mar 30 at 6:43






                  I agree with this answer. But from the two options stated here, First option should be the most suitable approach. The reason is, whenever you or someone else is going to use the code, they will not make the mistake mentioned in the question.

                  – LeoN
                  Mar 30 at 6:43














                  On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                  – DreamConspiracy
                  Mar 30 at 8:35





                  On the one hand, the first option is clearly better for the reason stated above, but the second option is useful too and should be considered. Doing what the OP accidentally did is useful in quite a few cases (although it violates some OOP principles, but I don't hold those in very high regard anyway)

                  – DreamConspiracy
                  Mar 30 at 8:35













                  4














                  There is no such thing as immutable (unchangeable) array in Java. The Java language does not support this, and neither does the JVM. You can't solve this at the language level.



                  In general, the only way to prevent changes to an array is to not share the reference to the array with other code that might change it.



                  In your example, you have what is known as a leaky abstraction. You are passing an array to your Person class, and the caller is keeping a reference to that array so that it can change it. To solve this, you can:



                  • copy the array, and pass a reference to the copy, or

                  • have the constructor (or a setter for the array attribute) make the copy.

                  (See answer https://stackoverflow.com/a/55428214/139985 for example code.)



                  The second alternative is preferable from an OO perspective. The Person class should be responsible for preserving its own internal state from interference ... if that is your design requirement. It should not rely on the caller to do this. (Even if the caller is technically part of the same class as is the case here.)






                  share|improve this answer

























                  • by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                    – Pac0
                    Mar 30 at 17:43















                  4














                  There is no such thing as immutable (unchangeable) array in Java. The Java language does not support this, and neither does the JVM. You can't solve this at the language level.



                  In general, the only way to prevent changes to an array is to not share the reference to the array with other code that might change it.



                  In your example, you have what is known as a leaky abstraction. You are passing an array to your Person class, and the caller is keeping a reference to that array so that it can change it. To solve this, you can:



                  • copy the array, and pass a reference to the copy, or

                  • have the constructor (or a setter for the array attribute) make the copy.

                  (See answer https://stackoverflow.com/a/55428214/139985 for example code.)



                  The second alternative is preferable from an OO perspective. The Person class should be responsible for preserving its own internal state from interference ... if that is your design requirement. It should not rely on the caller to do this. (Even if the caller is technically part of the same class as is the case here.)






                  share|improve this answer

























                  • by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                    – Pac0
                    Mar 30 at 17:43













                  4












                  4








                  4







                  There is no such thing as immutable (unchangeable) array in Java. The Java language does not support this, and neither does the JVM. You can't solve this at the language level.



                  In general, the only way to prevent changes to an array is to not share the reference to the array with other code that might change it.



                  In your example, you have what is known as a leaky abstraction. You are passing an array to your Person class, and the caller is keeping a reference to that array so that it can change it. To solve this, you can:



                  • copy the array, and pass a reference to the copy, or

                  • have the constructor (or a setter for the array attribute) make the copy.

                  (See answer https://stackoverflow.com/a/55428214/139985 for example code.)



                  The second alternative is preferable from an OO perspective. The Person class should be responsible for preserving its own internal state from interference ... if that is your design requirement. It should not rely on the caller to do this. (Even if the caller is technically part of the same class as is the case here.)






                  share|improve this answer















                  There is no such thing as immutable (unchangeable) array in Java. The Java language does not support this, and neither does the JVM. You can't solve this at the language level.



                  In general, the only way to prevent changes to an array is to not share the reference to the array with other code that might change it.



                  In your example, you have what is known as a leaky abstraction. You are passing an array to your Person class, and the caller is keeping a reference to that array so that it can change it. To solve this, you can:



                  • copy the array, and pass a reference to the copy, or

                  • have the constructor (or a setter for the array attribute) make the copy.

                  (See answer https://stackoverflow.com/a/55428214/139985 for example code.)



                  The second alternative is preferable from an OO perspective. The Person class should be responsible for preserving its own internal state from interference ... if that is your design requirement. It should not rely on the caller to do this. (Even if the caller is technically part of the same class as is the case here.)







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Mar 30 at 5:15

























                  answered Mar 30 at 4:56









                  Stephen CStephen C

                  526k72586944




                  526k72586944












                  • by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                    – Pac0
                    Mar 30 at 17:43

















                  • by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                    – Pac0
                    Mar 30 at 17:43
















                  by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                  – Pac0
                  Mar 30 at 17:43





                  by the way, about Leaky abstraction, Joel on Software has a relevant blog article joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions

                  – Pac0
                  Mar 30 at 17:43











                  1














                  There is no unmodifiable array, but you can make an unmodifiable list:



                  List<Integer> list = List.of(5, 10);


                  You will have to change your code to use lists instead of arrays, but this is generally preferable anyway.




                  If you already have an array of a non-primitive type, you can wrap it in an unmodifiable list, like so:



                  List<Integer> list = Collections.unmodifiableList(Arrays.asList(array));


                  However, while you can't change the list directly, changing the array will change the list. Moreover, this won't work on int[], but only on subclasses of Object[].






                  share|improve this answer





























                    1














                    There is no unmodifiable array, but you can make an unmodifiable list:



                    List<Integer> list = List.of(5, 10);


                    You will have to change your code to use lists instead of arrays, but this is generally preferable anyway.




                    If you already have an array of a non-primitive type, you can wrap it in an unmodifiable list, like so:



                    List<Integer> list = Collections.unmodifiableList(Arrays.asList(array));


                    However, while you can't change the list directly, changing the array will change the list. Moreover, this won't work on int[], but only on subclasses of Object[].






                    share|improve this answer



























                      1












                      1








                      1







                      There is no unmodifiable array, but you can make an unmodifiable list:



                      List<Integer> list = List.of(5, 10);


                      You will have to change your code to use lists instead of arrays, but this is generally preferable anyway.




                      If you already have an array of a non-primitive type, you can wrap it in an unmodifiable list, like so:



                      List<Integer> list = Collections.unmodifiableList(Arrays.asList(array));


                      However, while you can't change the list directly, changing the array will change the list. Moreover, this won't work on int[], but only on subclasses of Object[].






                      share|improve this answer















                      There is no unmodifiable array, but you can make an unmodifiable list:



                      List<Integer> list = List.of(5, 10);


                      You will have to change your code to use lists instead of arrays, but this is generally preferable anyway.




                      If you already have an array of a non-primitive type, you can wrap it in an unmodifiable list, like so:



                      List<Integer> list = Collections.unmodifiableList(Arrays.asList(array));


                      However, while you can't change the list directly, changing the array will change the list. Moreover, this won't work on int[], but only on subclasses of Object[].







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Mar 30 at 6:58

























                      answered Mar 30 at 6:49









                      Brian McCutchonBrian McCutchon

                      4,98222136




                      4,98222136





















                          0














                          Instead of passing a copy of the array to the object, as others have suggested, I would recommend that the Person object's constructor should create a copy. Which means instead of,



                          this.arrayTest = arrayTest;


                          It should be



                          this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length);


                          This would allow the object to be defensive against malicious code trying to modify arrays after construction and validation by constructor. In fact most IDEs have analysis tools which will give you a warning against saving array reference.






                          share|improve this answer



























                            0














                            Instead of passing a copy of the array to the object, as others have suggested, I would recommend that the Person object's constructor should create a copy. Which means instead of,



                            this.arrayTest = arrayTest;


                            It should be



                            this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length);


                            This would allow the object to be defensive against malicious code trying to modify arrays after construction and validation by constructor. In fact most IDEs have analysis tools which will give you a warning against saving array reference.






                            share|improve this answer

























                              0












                              0








                              0







                              Instead of passing a copy of the array to the object, as others have suggested, I would recommend that the Person object's constructor should create a copy. Which means instead of,



                              this.arrayTest = arrayTest;


                              It should be



                              this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length);


                              This would allow the object to be defensive against malicious code trying to modify arrays after construction and validation by constructor. In fact most IDEs have analysis tools which will give you a warning against saving array reference.






                              share|improve this answer













                              Instead of passing a copy of the array to the object, as others have suggested, I would recommend that the Person object's constructor should create a copy. Which means instead of,



                              this.arrayTest = arrayTest;


                              It should be



                              this.arrayTest = Arrays.copyOf(arrayTest, arrayTest.length);


                              This would allow the object to be defensive against malicious code trying to modify arrays after construction and validation by constructor. In fact most IDEs have analysis tools which will give you a warning against saving array reference.







                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Mar 30 at 6:47









                              Sourabh BhatSourabh Bhat

                              1,2601018




                              1,2601018





















                                  0















                                  In Java, objects/arrays are manipulated through reference variables#




                                  When a function is invoked with arrays as their arguments, only a reference to the array is passed. Therefore, when you mutate array array, the arrayTest field also get mutated as they are referring to the same address



                                  To override this behavior, you can create a copy of the array in your constructor using Object.clone() method like:



                                  public Person(int[] arrayTest) 
                                  this.arrayTest = arrayTest.clone();



                                  # Source: Wikipedia






                                  share|improve this answer





























                                    0















                                    In Java, objects/arrays are manipulated through reference variables#




                                    When a function is invoked with arrays as their arguments, only a reference to the array is passed. Therefore, when you mutate array array, the arrayTest field also get mutated as they are referring to the same address



                                    To override this behavior, you can create a copy of the array in your constructor using Object.clone() method like:



                                    public Person(int[] arrayTest) 
                                    this.arrayTest = arrayTest.clone();



                                    # Source: Wikipedia






                                    share|improve this answer



























                                      0












                                      0








                                      0








                                      In Java, objects/arrays are manipulated through reference variables#




                                      When a function is invoked with arrays as their arguments, only a reference to the array is passed. Therefore, when you mutate array array, the arrayTest field also get mutated as they are referring to the same address



                                      To override this behavior, you can create a copy of the array in your constructor using Object.clone() method like:



                                      public Person(int[] arrayTest) 
                                      this.arrayTest = arrayTest.clone();



                                      # Source: Wikipedia






                                      share|improve this answer
















                                      In Java, objects/arrays are manipulated through reference variables#




                                      When a function is invoked with arrays as their arguments, only a reference to the array is passed. Therefore, when you mutate array array, the arrayTest field also get mutated as they are referring to the same address



                                      To override this behavior, you can create a copy of the array in your constructor using Object.clone() method like:



                                      public Person(int[] arrayTest) 
                                      this.arrayTest = arrayTest.clone();



                                      # Source: Wikipedia







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Mar 30 at 7:02

























                                      answered Mar 30 at 6:57









                                      rv7rv7

                                      2,2061425




                                      2,2061425





















                                          0














                                          As others have already pointed out: The array is passed as a reference to the Person. So changes that are later done to the array will be visible to the Person object. But that's only one half of the problem: You are not only passing a reference to the array to the constructor of the Person, you are also returning a reference from the getArray method.




                                          Generally speaking, and as StephenC already pointed out in his answer: One important aspect of Object-Oriented design is to properly manage the state space of objects. It should not be possible for users of a class to bring an object into any form of "inconsistent state".



                                          And this is difficult with plain primitive arrays. Consider the following pseudocode, referring to the class that you posted:



                                          int originalArray[] = new int[2];
                                          originalArray[0] = 12;
                                          originalArray[1] = 34;

                                          Person person = new Person(originalArray);
                                          int arrayFromPerson[] = person.getArray();

                                          originalArray[0] = -666; // Modify the original array
                                          System.out.println(arrayFromPerson[0]) // Prints -666 - this is unexpected!

                                          arrayFromPerson[1] = 12345678; // Modify the array from the person
                                          System.out.println(originalArray[1]) // Prints 12345678 - this is unexpected!


                                          Nobody knows who has a reference to the array, and nobody can verify or track that the contents of the array is not changed in any way. How critical this is becomes more obvious when you anticipate that the Person object will be used at different places, possibly even by multiple threads.



                                          Plain primitive arrays in Java do have their justification. But when they appear in the interface of a class (that is, in its public methods), they should be view with scrutiny.



                                          In order to be absolutely sure that nobody can interfere with the array that is stored in the Person object, you'd have to create defensive copies everywhere:



                                          public Person(int[] arrayTest) 
                                          this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                          public int[] getArray()
                                          return this.arrayTest.clone(); // Return a clone of the array



                                          But this may be cumbersome. A more object-oriented solution could be to expose a "read-only view" on the state that is represented with the array. For example:



                                          public Person(int[] arrayTest) 
                                          this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                          public int getArrayLength()
                                          return this.arrayTest.length;

                                          public int getArrayElement(int index)
                                          return this.arrayTest[index];



                                          (Of course, in practice, you'd name the methods accordingly, depending on what the array actually represents. For example, if it's the ages of the children of the person, you'd call the methods getNumChildren() and getAgeOfChild(int i) or so...)



                                          Another option how this can be solved is to expose an (unmodifiable) List view on the array. This can, for example, be done with the asUnmodifiableList method that is shown in this answer.






                                          share|improve this answer



























                                            0














                                            As others have already pointed out: The array is passed as a reference to the Person. So changes that are later done to the array will be visible to the Person object. But that's only one half of the problem: You are not only passing a reference to the array to the constructor of the Person, you are also returning a reference from the getArray method.




                                            Generally speaking, and as StephenC already pointed out in his answer: One important aspect of Object-Oriented design is to properly manage the state space of objects. It should not be possible for users of a class to bring an object into any form of "inconsistent state".



                                            And this is difficult with plain primitive arrays. Consider the following pseudocode, referring to the class that you posted:



                                            int originalArray[] = new int[2];
                                            originalArray[0] = 12;
                                            originalArray[1] = 34;

                                            Person person = new Person(originalArray);
                                            int arrayFromPerson[] = person.getArray();

                                            originalArray[0] = -666; // Modify the original array
                                            System.out.println(arrayFromPerson[0]) // Prints -666 - this is unexpected!

                                            arrayFromPerson[1] = 12345678; // Modify the array from the person
                                            System.out.println(originalArray[1]) // Prints 12345678 - this is unexpected!


                                            Nobody knows who has a reference to the array, and nobody can verify or track that the contents of the array is not changed in any way. How critical this is becomes more obvious when you anticipate that the Person object will be used at different places, possibly even by multiple threads.



                                            Plain primitive arrays in Java do have their justification. But when they appear in the interface of a class (that is, in its public methods), they should be view with scrutiny.



                                            In order to be absolutely sure that nobody can interfere with the array that is stored in the Person object, you'd have to create defensive copies everywhere:



                                            public Person(int[] arrayTest) 
                                            this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                            public int[] getArray()
                                            return this.arrayTest.clone(); // Return a clone of the array



                                            But this may be cumbersome. A more object-oriented solution could be to expose a "read-only view" on the state that is represented with the array. For example:



                                            public Person(int[] arrayTest) 
                                            this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                            public int getArrayLength()
                                            return this.arrayTest.length;

                                            public int getArrayElement(int index)
                                            return this.arrayTest[index];



                                            (Of course, in practice, you'd name the methods accordingly, depending on what the array actually represents. For example, if it's the ages of the children of the person, you'd call the methods getNumChildren() and getAgeOfChild(int i) or so...)



                                            Another option how this can be solved is to expose an (unmodifiable) List view on the array. This can, for example, be done with the asUnmodifiableList method that is shown in this answer.






                                            share|improve this answer

























                                              0












                                              0








                                              0







                                              As others have already pointed out: The array is passed as a reference to the Person. So changes that are later done to the array will be visible to the Person object. But that's only one half of the problem: You are not only passing a reference to the array to the constructor of the Person, you are also returning a reference from the getArray method.




                                              Generally speaking, and as StephenC already pointed out in his answer: One important aspect of Object-Oriented design is to properly manage the state space of objects. It should not be possible for users of a class to bring an object into any form of "inconsistent state".



                                              And this is difficult with plain primitive arrays. Consider the following pseudocode, referring to the class that you posted:



                                              int originalArray[] = new int[2];
                                              originalArray[0] = 12;
                                              originalArray[1] = 34;

                                              Person person = new Person(originalArray);
                                              int arrayFromPerson[] = person.getArray();

                                              originalArray[0] = -666; // Modify the original array
                                              System.out.println(arrayFromPerson[0]) // Prints -666 - this is unexpected!

                                              arrayFromPerson[1] = 12345678; // Modify the array from the person
                                              System.out.println(originalArray[1]) // Prints 12345678 - this is unexpected!


                                              Nobody knows who has a reference to the array, and nobody can verify or track that the contents of the array is not changed in any way. How critical this is becomes more obvious when you anticipate that the Person object will be used at different places, possibly even by multiple threads.



                                              Plain primitive arrays in Java do have their justification. But when they appear in the interface of a class (that is, in its public methods), they should be view with scrutiny.



                                              In order to be absolutely sure that nobody can interfere with the array that is stored in the Person object, you'd have to create defensive copies everywhere:



                                              public Person(int[] arrayTest) 
                                              this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                              public int[] getArray()
                                              return this.arrayTest.clone(); // Return a clone of the array



                                              But this may be cumbersome. A more object-oriented solution could be to expose a "read-only view" on the state that is represented with the array. For example:



                                              public Person(int[] arrayTest) 
                                              this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                              public int getArrayLength()
                                              return this.arrayTest.length;

                                              public int getArrayElement(int index)
                                              return this.arrayTest[index];



                                              (Of course, in practice, you'd name the methods accordingly, depending on what the array actually represents. For example, if it's the ages of the children of the person, you'd call the methods getNumChildren() and getAgeOfChild(int i) or so...)



                                              Another option how this can be solved is to expose an (unmodifiable) List view on the array. This can, for example, be done with the asUnmodifiableList method that is shown in this answer.






                                              share|improve this answer













                                              As others have already pointed out: The array is passed as a reference to the Person. So changes that are later done to the array will be visible to the Person object. But that's only one half of the problem: You are not only passing a reference to the array to the constructor of the Person, you are also returning a reference from the getArray method.




                                              Generally speaking, and as StephenC already pointed out in his answer: One important aspect of Object-Oriented design is to properly manage the state space of objects. It should not be possible for users of a class to bring an object into any form of "inconsistent state".



                                              And this is difficult with plain primitive arrays. Consider the following pseudocode, referring to the class that you posted:



                                              int originalArray[] = new int[2];
                                              originalArray[0] = 12;
                                              originalArray[1] = 34;

                                              Person person = new Person(originalArray);
                                              int arrayFromPerson[] = person.getArray();

                                              originalArray[0] = -666; // Modify the original array
                                              System.out.println(arrayFromPerson[0]) // Prints -666 - this is unexpected!

                                              arrayFromPerson[1] = 12345678; // Modify the array from the person
                                              System.out.println(originalArray[1]) // Prints 12345678 - this is unexpected!


                                              Nobody knows who has a reference to the array, and nobody can verify or track that the contents of the array is not changed in any way. How critical this is becomes more obvious when you anticipate that the Person object will be used at different places, possibly even by multiple threads.



                                              Plain primitive arrays in Java do have their justification. But when they appear in the interface of a class (that is, in its public methods), they should be view with scrutiny.



                                              In order to be absolutely sure that nobody can interfere with the array that is stored in the Person object, you'd have to create defensive copies everywhere:



                                              public Person(int[] arrayTest) 
                                              this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                              public int[] getArray()
                                              return this.arrayTest.clone(); // Return a clone of the array



                                              But this may be cumbersome. A more object-oriented solution could be to expose a "read-only view" on the state that is represented with the array. For example:



                                              public Person(int[] arrayTest) 
                                              this.arrayTest = arrayTest.clone(); // Store a clone of the array

                                              public int getArrayLength()
                                              return this.arrayTest.length;

                                              public int getArrayElement(int index)
                                              return this.arrayTest[index];



                                              (Of course, in practice, you'd name the methods accordingly, depending on what the array actually represents. For example, if it's the ages of the children of the person, you'd call the methods getNumChildren() and getAgeOfChild(int i) or so...)



                                              Another option how this can be solved is to expose an (unmodifiable) List view on the array. This can, for example, be done with the asUnmodifiableList method that is shown in this answer.







                                              share|improve this answer












                                              share|improve this answer



                                              share|improve this answer










                                              answered Mar 30 at 16:05









                                              Marco13Marco13

                                              43.1k858111




                                              43.1k858111



























                                                  draft saved

                                                  draft discarded
















































                                                  Thanks for contributing an answer to Stack Overflow!


                                                  • Please be sure to answer the question. Provide details and share your research!

                                                  But avoid


                                                  • Asking for help, clarification, or responding to other answers.

                                                  • Making statements based on opinion; back them up with references or personal experience.

                                                  To learn more, see our tips on writing great answers.




                                                  draft saved


                                                  draft discarded














                                                  StackExchange.ready(
                                                  function ()
                                                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55428172%2fhow-to-prevent-changing-the-value-of-variable%23new-answer', 'question_page');

                                                  );

                                                  Post as a guest















                                                  Required, but never shown





















































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown

































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown







                                                  Popular posts from this blog

                                                  Boston (Lincolnshire) Stedsbyld | Berne yn Boston | NavigaasjemenuBoston Borough CouncilBoston, Lincolnshire

                                                  Ballerup Komuun Stääden an saarpen | Futnuuten | Luke uk diar | Nawigatsjuunwww.ballerup.dkwww.statistikbanken.dk: Tabelle BEF44 (Folketal pr. 1. januar fordelt på byer)Commonskategorii: Ballerup Komuun55° 44′ N, 12° 22′ O

                                                  Serbia Índice Etimología Historia Geografía Entorno natural División administrativa Política Demografía Economía Cultura Deportes Véase también Notas Referencias Bibliografía Enlaces externos Menú de navegación44°49′00″N 20°28′00″E / 44.816666666667, 20.46666666666744°49′00″N 20°28′00″E / 44.816666666667, 20.466666666667U.S. Department of Commerce (2015)«Informe sobre Desarrollo Humano 2018»Kosovo-Metohija.Neutralna Srbija u NATO okruzenju.The SerbsTheories on the Origin of the Serbs.Serbia.Earls: Webster's Quotations, Facts and Phrases.Egeo y Balcanes.Kalemegdan.Southern Pannonia during the age of the Great Migrations.Culture in Serbia.History.The Serbian Origin of the Montenegrins.Nemanjics' period (1186-1353).Stefan Uros (1355-1371).Serbian medieval history.Habsburg–Ottoman Wars (1525–1718).The Ottoman Empire, 1700-1922.The First Serbian Uprising.Miloš, prince of Serbia.3. Bosnia-Hercegovina and the Congress of Berlin.The Balkan Wars and the Partition of Macedonia.The Falcon and the Eagle: Montenegro and Austria-Hungary, 1908-1914.Typhus fever on the eastern front in World War I.Anniversary of WWI battle marked in Serbia.La derrota austriaca en los Balcanes. Fin del Imperio Austro-Húngaro.Imperio austriaco y Reino de Hungría.Los tiempos modernos: del capitalismo a la globalización, siglos XVII al XXI.The period of Croatia within ex-Yugoslavia.Yugoslavia: Much in a Name.Las dictaduras europeas.Croacia: mito y realidad."Crods ask arms".Prólogo a la invasión.La campaña de los Balcanes.La resistencia en Yugoslavia.Jasenovac Research Institute.Día en memoria de las víctimas del genocidio en la Segunda Guerra Mundial.El infierno estuvo en Jasenovac.Croacia empieza a «desenterrar» a sus muertos de Jasenovac.World fascism: a historical encyclopedia, Volumen 1.Tito. Josip Broz.El nuevo orden y la resistencia.La conquista del poder.Algunos aspectos de la economía yugoslava a mediados de 1962.Albania-Kosovo crisis.De Kosovo a Kosova: una visión demográfica.La crisis de la economía yugoslava y la política de "estabilización".Milosevic: el poder de un absolutista."Serbia under Milošević: politics in the 1990s"Milosevic cavó en Kosovo la tumba de la antigua Yugoslavia.La ONU exculpa a Serbia de genocidio en la guerra de Bosnia.Slobodan Milosevic, el burócrata que supo usar el odio.Es la fuerza contra el sufrimiento de muchos inocentes.Matanza de civiles al bombardear la OTAN un puente mientras pasaba un tren.Las consecuencias negativas de los bombardeos de Yugoslavia se sentirán aún durante largo tiempo.Kostunica advierte que la misión de Europa en Kosovo es ilegal.Las 24 horas más largas en la vida de Slobodan Milosevic.Serbia declara la guerra a la mafia por matar a Djindjic.Tadic presentará "quizás en diciembre" la solicitud de entrada en la UE.Montenegro declara su independencia de Serbia.Serbia se declara estado soberano tras separación de Montenegro.«Accordance with International Law of the Unilateral Declaration of Independence by the Provisional Institutions of Self-Government of Kosovo (Request for Advisory Opinion)»Mladic pasa por el médico antes de la audiencia para extraditarloDatos de Serbia y Kosovo.The Carpathian Mountains.Position, Relief, Climate.Transport.Finding birds in Serbia.U Srbiji do 2010. godine 10% teritorije nacionalni parkovi.Geography.Serbia: Climate.Variability of Climate In Serbia In The Second Half of The 20thc Entury.BASIC CLIMATE CHARACTERISTICS FOR THE TERRITORY OF SERBIA.Fauna y flora: Serbia.Serbia and Montenegro.Información general sobre Serbia.Republic of Serbia Environmental Protection Agency (SEPA).Serbia recycling 15% of waste.Reform process of the Serbian energy sector.20-MW Wind Project Being Developed in Serbia.Las Naciones Unidas. Paz para Kosovo.Aniversario sin fiesta.Population by national or ethnic groups by Census 2002.Article 7. Coat of arms, flag and national anthem.Serbia, flag of.Historia.«Serbia and Montenegro in Pictures»Serbia.Serbia aprueba su nueva Constitución con un apoyo de más del 50%.Serbia. Population.«El nacionalista Nikolic gana las elecciones presidenciales en Serbia»El europeísta Borís Tadic gana la segunda vuelta de las presidenciales serbias.Aleksandar Vucic, de ultranacionalista serbio a fervoroso europeístaKostunica condena la declaración del "falso estado" de Kosovo.Comienza el debate sobre la independencia de Kosovo en el TIJ.La Corte Internacional de Justicia dice que Kosovo no violó el derecho internacional al declarar su independenciaKosovo: Enviado de la ONU advierte tensiones y fragilidad.«Bruselas recomienda negociar la adhesión de Serbia tras el acuerdo sobre Kosovo»Monografía de Serbia.Bez smanjivanja Vojske Srbije.Military statistics Serbia and Montenegro.Šutanovac: Vojni budžet za 2009. godinu 70 milijardi dinara.Serbia-Montenegro shortens obligatory military service to six months.No hay justicia para las víctimas de los bombardeos de la OTAN.Zapatero reitera la negativa de España a reconocer la independencia de Kosovo.Anniversary of the signing of the Stabilisation and Association Agreement.Detenido en Serbia Radovan Karadzic, el criminal de guerra más buscado de Europa."Serbia presentará su candidatura de acceso a la UE antes de fin de año".Serbia solicita la adhesión a la UE.Detenido el exgeneral serbobosnio Ratko Mladic, principal acusado del genocidio en los Balcanes«Lista de todos los Estados Miembros de las Naciones Unidas que son parte o signatarios en los diversos instrumentos de derechos humanos de las Naciones Unidas»versión pdfProtocolo Facultativo de la Convención sobre la Eliminación de todas las Formas de Discriminación contra la MujerConvención contra la tortura y otros tratos o penas crueles, inhumanos o degradantesversión pdfProtocolo Facultativo de la Convención sobre los Derechos de las Personas con DiscapacidadEl ACNUR recibe con beneplácito el envío de tropas de la OTAN a Kosovo y se prepara ante una posible llegada de refugiados a Serbia.Kosovo.- El jefe de la Minuk denuncia que los serbios boicotearon las legislativas por 'presiones'.Bosnia and Herzegovina. Population.Datos básicos de Montenegro, historia y evolución política.Serbia y Montenegro. Indicador: Tasa global de fecundidad (por 1000 habitantes).Serbia y Montenegro. Indicador: Tasa bruta de mortalidad (por 1000 habitantes).Population.Falleció el patriarca de la Iglesia Ortodoxa serbia.Atacan en Kosovo autobuses con peregrinos tras la investidura del patriarca serbio IrinejSerbian in Hungary.Tasas de cambio."Kosovo es de todos sus ciudadanos".Report for Serbia.Country groups by income.GROSS DOMESTIC PRODUCT (GDP) OF THE REPUBLIC OF SERBIA 1997–2007.Economic Trends in the Republic of Serbia 2006.National Accounts Statitics.Саопштења за јавност.GDP per inhabitant varied by one to six across the EU27 Member States.Un pacto de estabilidad para Serbia.Unemployment rate rises in Serbia.Serbia, Belarus agree free trade to woo investors.Serbia, Turkey call investors to Serbia.Success Stories.U.S. Private Investment in Serbia and Montenegro.Positive trend.Banks in Serbia.La Cámara de Comercio acompaña a empresas madrileñas a Serbia y Croacia.Serbia Industries.Energy and mining.Agriculture.Late crops, fruit and grapes output, 2008.Rebranding Serbia: A Hobby Shortly to Become a Full-Time Job.Final data on livestock statistics, 2008.Serbian cell-phone users.U Srbiji sve više računara.Телекомуникације.U Srbiji 27 odsto gradjana koristi Internet.Serbia and Montenegro.Тренд гледаности програма РТС-а у 2008. и 2009.години.Serbian railways.General Terms.El mercado del transporte aéreo en Serbia.Statistics.Vehículos de motor registrados.Planes ambiciosos para el transporte fluvial.Turismo.Turistički promet u Republici Srbiji u periodu januar-novembar 2007. godine.Your Guide to Culture.Novi Sad - city of culture.Nis - european crossroads.Serbia. Properties inscribed on the World Heritage List .Stari Ras and Sopoćani.Studenica Monastery.Medieval Monuments in Kosovo.Gamzigrad-Romuliana, Palace of Galerius.Skiing and snowboarding in Kopaonik.Tara.New7Wonders of Nature Finalists.Pilgrimage of Saint Sava.Exit Festival: Best european festival.Banje u Srbiji.«The Encyclopedia of world history»Culture.Centenario del arte serbio.«Djordje Andrejevic Kun: el único pintor de los brigadistas yugoslavos de la guerra civil española»About the museum.The collections.Miroslav Gospel – Manuscript from 1180.Historicity in the Serbo-Croatian Heroic Epic.Culture and Sport.Conversación con el rector del Seminario San Sava.'Reina Margot' funde drama, historia y gesto con música de Goran Bregovic.Serbia gana Eurovisión y España decepciona de nuevo con un vigésimo puesto.Home.Story.Emir Kusturica.Tercer oro para Paskaljevic.Nikola Tesla Year.Home.Tesla, un genio tomado por loco.Aniversario de la muerte de Nikola Tesla.El Museo Nikola Tesla en Belgrado.El inventor del mundo actual.República de Serbia.University of Belgrade official statistics.University of Novi Sad.University of Kragujevac.University of Nis.Comida. Cocina serbia.Cooking.Montenegro se convertirá en el miembro 204 del movimiento olímpico.España, campeona de Europa de baloncesto.El Partizan de Belgrado se corona campeón por octava vez consecutiva.Serbia se clasifica para el Mundial de 2010 de Sudáfrica.Serbia Name Squad For Northern Ireland And South Korea Tests.Fútbol.- El Partizán de Belgrado se proclama campeón de la Liga serbia.Clasificacion final Mundial de balonmano Croacia 2009.Serbia vence a España y se consagra campeón mundial de waterpolo.Novak Djokovic no convence pero gana en Australia.Gana Ana Ivanovic el Roland Garros.Serena Williams gana el US Open por tercera vez.Biography.Bradt Travel Guide SerbiaThe Encyclopedia of World War IGobierno de SerbiaPortal del Gobierno de SerbiaPresidencia de SerbiaAsamblea Nacional SerbiaMinisterio de Asuntos exteriores de SerbiaBanco Nacional de SerbiaAgencia Serbia para la Promoción de la Inversión y la ExportaciónOficina de Estadísticas de SerbiaCIA. Factbook 2008Organización nacional de turismo de SerbiaDiscover SerbiaConoce SerbiaNoticias de SerbiaSerbiaWorldCat1512028760000 0000 9526 67094054598-2n8519591900570825ge1309191004530741010url17413117006669D055771Serbia