but can I compatibly turn a class type into a record type? It's potentially a source-compatible change (make the state description match the class's ctor), but binary-compatible?

Yes.  You can transform

    class Point {
        final int x, y;

        public Point(int x, int y) { this.x = x; this.y = y; }

        public int x() { return x; }
        public int y() { return y; }

        // state-based equals and hashCode

        // more methods
    }

into

    record Point(int x, int y) {
        // more methods
    }

and this will be source- and binary-compatible.

Similarly, if a record type is chafing at the restrictions of "state only!", then can I (source|binary)-compatibly turn it into a class type?

Yes, mostly.  Records do currently have one aspect that is not *yet* denotable by ordinary classes; the pattern match extractor.  Until ordinary classes can declare one, existing records whose clients use pattern matching can't be migrated.


Reply via email to