public class NoCloneCheck extends AbstractIllegalMethodCheck
Checks that the clone method is not overridden from the Object class.
Rationale: The clone method relies on strange/hard to follow rules that do not work it all situations. Consequently, it is difficult to override correctly. Below are some of the rules/reasons why the clone method should be avoided.
Two alternatives to the clone method, in some cases, is a copy constructor or a static factory method to return copies of an object. Both of these approaches are simpler and do not conflict with final fields. They do not force the calling client to handle a CloneNotSupportedException. They also are typed therefore no casting is necessary. Finally, they are more flexible since they can take interface types rather than concrete classes.
Sometimes a copy constructor or static factory is not an acceptable alternative to the clone method. The example below highlights the limitation of a copy constructor (or static factory). Assume Square is a subclass for Shape.
Shape s1 = new Square(); System.out.println(s1 instanceof Square); //true...assume at this point the code knows nothing of s1 being a Square that's the beauty of polymorphism but the code wants to copy the Square which is declared as a Shape, its super type...
Shape s2 = new Shape(s1); //using the copy constructor System.out.println(s2 instanceof Square); //falseThe working solution (without knowing about all subclasses and doing many casts) is to do the following (assuming correct clone implementation).
Shape s2 = s1.clone(); System.out.println(s2 instanceof Square); //trueJust keep in mind if this type of polymorphic cloning is required then a properly implemented clone method may be the best choice.
Much of this information was taken from Effective Java: Programming Language Guide First Edition by Joshua Bloch pages 45-52. Give Bloch credit for writing an excellent book.
This check is almost exactly the same as the NoFinalizerCheck
Object.clone()
,
Cloneable
,
CloneNotSupportedException
Constructor and Description |
---|
NoCloneCheck()
Creates an instance.
|
getDefaultTokens, visitToken
beginTree, destroy, finishTree, getAcceptableTokens, getClassLoader, getFileContents, getLine, getLines, getRequiredTokens, getTabWidth, getTokenNames, init, isCommentNodesRequired, leaveToken, log, log, setClassLoader, setFileContents, setMessages, setTabWidth, setTokens
getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, log, setId, setSeverity
configure, contextualize, finishLocalSetup, getConfiguration, setupChild
public NoCloneCheck()
Copyright © 2001–2015. All rights reserved.