How to prevent changing the value of variable The 2019 Stack Overflow Developer Survey Results Are InConvert 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 can a perfect fourth interval be considered either consonant or dissonant?

Would an alien lifeform be able to achieve space travel if lacking in vision?

Grounding Vcc and Vee?

Keeping a retro style to sci-fi spaceships?

Are spiders unable to hurt humans, especially very small spiders?

How to fill page vertically?

How can I define good in a religion that claims no moral authority?

Merge multiple DataFrames Pandas

What do I do when my TA workload is more than expected?

What was the last x86 CPU that did not have the x87 floating-point unit built in?

Cooking pasta in a water boiler

What aspect of planet earth must be changed to prevent the industrial revolution?

Can we generate random numbers using irrational numbers like π and e?

One Dimensional Japanese Puzzle

Ubuntu Err :18 http://dl.google.com/linux/chrome/deb stable Release.gpg KEYEXPIRED 1555048520

Quantum Toffoli gate equation

Define a list range inside a list

Why did Peik say, "I'm not an animal"?

Why can't devices on different VLANs, but on the same subnet, communicate?

Single author papers against my advisor's will?

Can I visit the Trinity College (Cambridge) library and see some of their rare books

Pascal records and Mathematica programming

Using dividends to reduce short term capital gains?

What other Star Trek series did the main TNG cast show up in?



How to prevent changing the value of variable



The 2019 Stack Overflow Developer Survey Results Are InConvert 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
























  • You have not accepted any answer, I would recommend you to do so.

    – roundAbout
    2 days ago

















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
























  • You have not accepted any answer, I would recommend you to do so.

    – roundAbout
    2 days ago













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.9k1987114




13.9k1987114










asked Mar 30 at 4:32









OpheliaOphelia

693




693












  • You have not accepted any answer, I would recommend you to do so.

    – roundAbout
    2 days ago

















  • You have not accepted any answer, I would recommend you to do so.

    – roundAbout
    2 days ago
















You have not accepted any answer, I would recommend you to do so.

– roundAbout
2 days ago





You have not accepted any answer, I would recommend you to do so.

– roundAbout
2 days ago












6 Answers
6






active

oldest

votes


















13














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









          13














          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















          13














          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













          13












          13








          13







          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,74021441




          6,74021441







          • 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

          527k72587945




          527k72587945












          • 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

              5,01222136




              5,01222136





















                  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,2701018




                      1,2701018





















                          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

                                          Adding axes to figuresAdding axes labels to LaTeX figuresLaTeX equivalent of ConTeXt buffersRotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?TikZ scaling graphic and adjust node position and keep font sizeNumerical conditional within tikz keys?adding axes to shapesAlign axes across subfiguresAdding figures with a certain orderLine up nested tikz enviroments or how to get rid of themAdding axes labels to LaTeX figures

                                          Luettelo Yhdysvaltain laivaston lentotukialuksista Lähteet | Navigointivalikko

                                          Gary (muusikko) Sisällysluettelo Historia | Rockin' High | Lähteet | Aiheesta muualla | NavigointivalikkoInfobox OKTuomas "Gary" Keskinen Ancaran kitaristiksiProjekti Rockin' High