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

I'm in your subnets, golfing your code

How can internet speed be 10 times slower without a router than when using a router?

Do you know any research on finding closed forms of recursively-defined sequences?

What is the solution to this metapuzzle from a university puzzling column?

What was Bran's plan to kill the Night King?

Why is Arya visibly scared in the library in Game of Thrones S8E3?

Can my company stop me from working overtime?

Missing Piece of Pie - Can you find it?

How do LIGO and VIRGO know that a gravitational wave has its origin in a neutron star or a black hole?

How to create a variant of a composite rendering?

Introducing Gladys, an intrepid globetrotter

How should I tell my manager I'm not paying for an optional after work event I'm not going to?

What matters more when it comes to book covers? Is it ‘professional quality’ or relevancy?

Why do only some White Walkers shatter into ice chips?

Should I mention being denied entry to UK due to a confusion in my Visa and Ticket bookings?

How long would it take for people to notice a mass disappearance?

What is the closest airport to the center of the city it serves?

How can I close a gap between my fence and my neighbor's that's on his side of the property line?

What to use instead of cling film to wrap pastry

Hyperlink on red background

What does this colon mean? It is not labeling, it is not ternary operator

Beamwidth of omni-directional antenna with gain

Have I damaged my car by attempting to reverse with hand/park brake up?

Building a list of products from the elements in another list



How to prevent changing the value of variable


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






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








13















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

















This question has an open bounty worth +50
reputation from roundAbout ending ending at 2019-05-06 10:45:08Z">in 4 days.


Looking for an answer drawing from credible and/or official sources.






















    13















    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

















    This question has an open bounty worth +50
    reputation from roundAbout ending ending at 2019-05-06 10:45:08Z">in 4 days.


    Looking for an answer drawing from credible and/or official sources.


















      13












      13








      13


      2






      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

      14k1987114




      14k1987114










      asked Mar 30 at 4:32









      OpheliaOphelia

      744




      744






      This question has an open bounty worth +50
      reputation from roundAbout ending ending at 2019-05-06 10:45:08Z">in 4 days.


      Looking for an answer drawing from credible and/or official sources.








      This question has an open bounty worth +50
      reputation from roundAbout ending ending at 2019-05-06 10:45:08Z">in 4 days.


      Looking for an answer drawing from credible and/or official sources.
























          7 Answers
          7






          active

          oldest

          votes


















          16














          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











          • Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

            – WJS
            Apr 29 at 12:21



















          5














          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
































            1















            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














              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














                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 you are beginner in java you write following code in constructor but it is better to use clone method as marco13 and rv 7 already explained
                  and as sourabh bhat explained we can also use Arrays class copyof



                  the idea behind all of above logic is simple don't pass referance of current object but create clone of object and pass that clone or just copy each content of the object



                   public Person(int[] arrayTest) 
                  for (int i = 0; i <this.arrayTest.length; i++)
                  this.arrayTest[i]=arrayTest[i];








                  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

























                    7 Answers
                    7






                    active

                    oldest

                    votes








                    7 Answers
                    7






                    active

                    oldest

                    votes









                    active

                    oldest

                    votes






                    active

                    oldest

                    votes









                    16














                    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











                    • Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                      – WJS
                      Apr 29 at 12:21
















                    16














                    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











                    • Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                      – WJS
                      Apr 29 at 12:21














                    16












                    16








                    16







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




                    6,86021441







                    • 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











                    • Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                      – WJS
                      Apr 29 at 12:21













                    • 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











                    • Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                      – WJS
                      Apr 29 at 12:21








                    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













                    Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                    – WJS
                    Apr 29 at 12:21






                    Actually, both arrays and and objects are passed by value. Thus assigning a new array or object to the one passed won't change the original in the called context. But when accessing elements both the array and the object are used as references to allow altering of what they refer too.

                    – WJS
                    Apr 29 at 12:21














                    5














                    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















                    5














                    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













                    5












                    5








                    5







                    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

                    529k72590948




                    529k72590948












                    • 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,05222136




                        5,05222136





















                            1















                            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





























                              1















                              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



























                                1












                                1








                                1








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




                                2,2261425





















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




                                        1,2901018





















                                            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.3k860113




                                                43.3k860113





















                                                    0














                                                    as you are beginner in java you write following code in constructor but it is better to use clone method as marco13 and rv 7 already explained
                                                    and as sourabh bhat explained we can also use Arrays class copyof



                                                    the idea behind all of above logic is simple don't pass referance of current object but create clone of object and pass that clone or just copy each content of the object



                                                     public Person(int[] arrayTest) 
                                                    for (int i = 0; i <this.arrayTest.length; i++)
                                                    this.arrayTest[i]=arrayTest[i];








                                                    share|improve this answer



























                                                      0














                                                      as you are beginner in java you write following code in constructor but it is better to use clone method as marco13 and rv 7 already explained
                                                      and as sourabh bhat explained we can also use Arrays class copyof



                                                      the idea behind all of above logic is simple don't pass referance of current object but create clone of object and pass that clone or just copy each content of the object



                                                       public Person(int[] arrayTest) 
                                                      for (int i = 0; i <this.arrayTest.length; i++)
                                                      this.arrayTest[i]=arrayTest[i];








                                                      share|improve this answer

























                                                        0












                                                        0








                                                        0







                                                        as you are beginner in java you write following code in constructor but it is better to use clone method as marco13 and rv 7 already explained
                                                        and as sourabh bhat explained we can also use Arrays class copyof



                                                        the idea behind all of above logic is simple don't pass referance of current object but create clone of object and pass that clone or just copy each content of the object



                                                         public Person(int[] arrayTest) 
                                                        for (int i = 0; i <this.arrayTest.length; i++)
                                                        this.arrayTest[i]=arrayTest[i];








                                                        share|improve this answer













                                                        as you are beginner in java you write following code in constructor but it is better to use clone method as marco13 and rv 7 already explained
                                                        and as sourabh bhat explained we can also use Arrays class copyof



                                                        the idea behind all of above logic is simple don't pass referance of current object but create clone of object and pass that clone or just copy each content of the object



                                                         public Person(int[] arrayTest) 
                                                        for (int i = 0; i <this.arrayTest.length; i++)
                                                        this.arrayTest[i]=arrayTest[i];









                                                        share|improve this answer












                                                        share|improve this answer



                                                        share|improve this answer










                                                        answered yesterday









                                                        Nilesh TammewarNilesh Tammewar

                                                        32




                                                        32



























                                                            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

                                                            Bruad Bilen | Luke uk diar | NawigatsjuunCommonskategorii: BruadCommonskategorii: RunstükenWikiquote: Bruad

                                                            What is the offset in a seaplane's hull?

                                                            Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029