Encapsulation of information is folly

(written by lawrence krubner, however indented passages are often quotes). You can contact lawrence at: lawrence@krubner.com

This is strongly stated, and surprising:

Datatypes and protocols are opinionated

While datatypes and protocols have well-defined relationships with host constructs, and make for a great way to expose Clojure functionality to Java programs, they are not primarily interop constructs. That is, they make no effort to completely mimic or adapt to all of the OO mechanisms of the host. In particular, they reflect the following opinions:

Concrete derivation is bad:
you cannot derive datatypes from concrete classes, only interfaces

You should always program to protocols or interfaces:
datatypes cannot expose methods not in their protocols or interfaces

Immutability should be the default:
and is the only option for records

Encapsulation of information is folly:
fields are public, use protocols/interfaces to avoid dependencies

Tying polymorphism to inheritance is bad:
protocols free you from that

Source