Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8203465

Add a lint mode for diagnosing violations of specification for value based classes



    • Enhancement
    • Status: Resolved
    • P4
    • Resolution: Duplicate
    • None
    • None
    • tools
    • None
    • generic
    • generic


      Since Java 8 we have had the notion of "Value Based Classes" as specified by src/java.base/share/classes/java/lang/doc-files/ValueBased.html reproduced inline here:

      // --------------------------------------------

      Value-based Classes

      Some classes, such as java.util.Optional and java.time.LocalDateTime, are value-based. Instances of a value-based class:
          - are final and immutable (though may contain references to mutable objects);
          - have implementations of equals, hashCode, and toString which are computed solely from the instance's state and not from its identity or the state of any other object or variable;
          - make no use of identity-sensitive operations such as reference equality (==) between instances, identity hash code of instances, or synchronization on an instances's intrinsic lock;
          - are considered equal solely based on equals(), not based on reference equality (==);
          - do not have accessible constructors, but are instead instantiated through factory methods which make no committment as to the identity of returned instances;
          - are freely substitutable when equal, meaning that interchanging any two instances x and y that are equal according to equals() in any computation or method invocation should produce no visible change in behavior.

      A program may produce unpredictable results if it attempts to distinguish two references to equal values of a value-based class, whether directly via reference equality or indirectly via an appeal to synchronization, identity hashing, serialization, or any other identity-sensitive mechanism. Use of such identity-sensitive operations on instances of value-based classes may have unpredictable effects and should be avoided.

      // --------------------------------------------

      It is now requested that Javac implement a lint mode that checks for violations of this specification and emit suitable warnings. This is to facilitate migration/evolution of such value based classes into full blown value types as and when such types get supported in the language.

      In any event, it is useful to have a lint mode that checks for violations of the contract given that we have a specification for value based classes.

      This feature would required value based classes to be tagged somehow, very likely with a @ValueBased annotation

      The lint mode is envisaged to be an opt in mode.


        Issue Links



              sadayapalam Srikanth Adayapalam (Inactive)
              sadayapalam Srikanth Adayapalam (Inactive)
              0 Vote for this issue
              1 Start watching this issue