可以编译器强制执行对象不变性的OO语言列表

Sim*_*eon 6 language-agnostic programming-languages language-design immutability

任何人都可以给我一个语言列表,其中类不变性可以编译器强制执行和测试吗?

我需要能够做到这样的事情:

class immutable Person {
    private String name = "Jhon"; // lets say the String is mutable

    public Person(String name) {
        this.name = name; // ok
    }

    public void setName(String newName) { 
        this.name = newName; // does not compile
    }

    public void getName() { 
        return this.name; //returns reference through which name can't be mutated
    }

    private void testImmutability() {
        getName().setFirstChar('a'); // does not compile
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

有关更多说明,请参见此处.

Apa*_*ala 5

函数式编程语言,如OCAML,Haskell和Erlang.

  • 默认情况下,@ Simeon Objects在所提到的语言中是不可变的.从Web中提取的任何代码示例都可以. (2认同)

Mik*_*uel 3

乔-E

语言规范来看

3.4 不可变类型

当且仅当类型 Torg.joe_e.Immutable根据覆盖类型系统实现标记接口时,它才是不可变的。(空)org.joe_e.Immutable接口必须由 Joe-E 实现提供。不可变对象背后的直觉是,这样的对象不能以任何可观察的方式更改(变异),也不能通过遵循不可变对象的字段来访问任何对象。一旦构造了对象,不可变对象字段的内容以及可从不可变对象访问的任何对象都不得更改。除了明确认为实现的库类之外Immutable,不可变类必须满足验证者 (x4.4) 强制执行的附加语言限制,以确保此属性。无法自动验证并被视为不可变的库类必须仔细手动验证,以防止其内容被修改。请注意,不变性不会对不可变类中定义的任何局部变量施加任何限制。它还没有提及传递给方法的参数的可变性。它仅适用于存储在不可变类的字段中的值以及可从不可变类的字段访问的对象

它还引入了无能为力和无私类型的有用概念。