How to prevent changing the value of variable The Next CEO of Stack OverflowConvert 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?

Is it convenient to ask the journal's editor for two additional days to complete a review?

Aggressive Under-Indexing and no data for missing index

Is there an equivalent of cd - for cp or mv

IC has pull-down resistors on SMBus lines?

AB diagonalizable then BA also diagonalizable

Redefining symbol midway through a document

Can someone explain this formula for calculating Manhattan distance?

Defamation due to breach of confidentiality

Is it ok to trim down a tube patch?

Graph of the history of databases

How to Implement Deterministic Encryption Safely in .NET

Reshaping json / reparing json inside shell script (remove trailing comma)

Where do students learn to solve polynomial equations these days?

TikZ: How to fill area with a special pattern?

Is there a difference between "Fahrstuhl" and "Aufzug"?

Expressing the idea of having a very busy time

Purpose of level-shifter with same in and out voltages

What would be the main consequences for a country leaving the WTO?

Getting Stale Gas Out of a Gas Tank w/out Dropping the Tank

Is a distribution that is normal, but highly skewed, considered Gaussian?

Is there a reasonable and studied concept of reduction between regular languages?

Can Sneak Attack be used when hitting with an improvised weapon?

What day is it again?

In the "Harry Potter and the Order of the Phoenix" video game, what potion is used to sabotage Umbridge's speakers?



How to prevent changing the value of variable



The Next CEO of Stack OverflowConvert 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?










10















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




























    10















    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


























      10












      10








      10


      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 yesterday









      Peter Mortensen

      13.8k1987113




      13.8k1987113










      asked yesterday









      OpheliaOphelia

      593




      593






















          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
            yesterday












          • 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
            yesterday


















          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
            yesterday


















          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
                    yesterday












                  • 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
                    yesterday















                  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
                    yesterday












                  • 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
                    yesterday













                  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 yesterday

























                  answered yesterday









                  Aniket SahrawatAniket Sahrawat

                  6,41621340




                  6,41621340







                  • 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
                    yesterday












                  • 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
                    yesterday












                  • 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
                    yesterday












                  • 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
                    yesterday







                  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
                  yesterday






                  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
                  yesterday














                  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
                  yesterday





                  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
                  yesterday













                  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
                    yesterday















                  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
                    yesterday













                  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 yesterday

























                  answered yesterday









                  Stephen CStephen C

                  525k72585944




                  525k72585944












                  • 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
                    yesterday

















                  • 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
                    yesterday
















                  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
                  yesterday





                  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
                  yesterday











                  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 yesterday

























                      answered yesterday









                      Brian McCutchonBrian McCutchon

                      4,97222136




                      4,97222136





















                          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 yesterday









                              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 yesterday

























                                      answered yesterday









                                      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 yesterday









                                              Marco13Marco13

                                              43k858111




                                              43k858111



























                                                  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

                                                  Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

                                                  Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070

                                                  Cegueira Índice Epidemioloxía | Deficiencia visual | Tipos de cegueira | Principais causas de cegueira | Tratamento | Técnicas de adaptación e axudas | Vida dos cegos | Primeiros auxilios | Crenzas respecto das persoas cegas | Crenzas das persoas cegas | O neno deficiente visual | Aspectos psicolóxicos da cegueira | Notas | Véxase tamén | Menú de navegación54.054.154.436928256blindnessDicionario da Real Academia GalegaPortal das Palabras"International Standards: Visual Standards — Aspects and Ranges of Vision Loss with Emphasis on Population Surveys.""Visual impairment and blindness""Presentan un plan para previr a cegueira"o orixinalACCDV Associació Catalana de Cecs i Disminuïts Visuals - PMFTrachoma"Effect of gene therapy on visual function in Leber's congenital amaurosis"1844137110.1056/NEJMoa0802268Cans guía - os mellores amigos dos cegosArquivadoEscola de cans guía para cegos en Mortágua, PortugalArquivado"Tecnología para ciegos y deficientes visuales. Recopilación de recursos gratuitos en la Red""Colorino""‘COL.diesis’, escuchar los sonidos del color""COL.diesis: Transforming Colour into Melody and Implementing the Result in a Colour Sensor Device"o orixinal"Sistema de desarrollo de sinestesia color-sonido para invidentes utilizando un protocolo de audio""Enseñanza táctil - geometría y color. Juegos didácticos para niños ciegos y videntes""Sistema Constanz"L'ocupació laboral dels cecs a l'Estat espanyol està pràcticament equiparada a la de les persones amb visió, entrevista amb Pedro ZuritaONCE (Organización Nacional de Cegos de España)Prevención da cegueiraDescrición de deficiencias visuais (Disc@pnet)Braillín, un boneco atractivo para calquera neno, con ou sen discapacidade, que permite familiarizarse co sistema de escritura e lectura brailleAxudas Técnicas36838ID00897494007150-90057129528256DOID:1432HP:0000618D001766C10.597.751.941.162C97109C0155020