Список ОО-языков, в которых неизменяемость объекта может быть применена компилятором - PullRequest
6 голосов
/ 19 января 2011

Может кто-нибудь дать мне список языков, где неизменность классов может быть легко реализована и протестирована компилятором?

Мне нужно иметь возможность сделать что-то вроде:

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
    }
}

РЕДАКТИРОВАТЬ:

Для немного больше разъяснений см. здесь .

Ответы [ 4 ]

5 голосов
/ 20 января 2011

Функциональные языки программирования, такие как OCAML, Haskell и Erlang.

4 голосов
/ 19 января 2011

Joe-E

Из спецификации языка

3,4 Неизменяемые типы

Тип T является неизменным тогда и только тогда, когда он реализует интерфейс маркера org.joe_e.Immutable в соответствии с оверлеем система типов. Должен быть предоставлен (пустой) интерфейс org.joe_e.Immutable реализацией Joe-E. интуиция за неизменным объектом является то, что такой объект не может быть изменено (видоизменено) в любой наблюдаемой путь, и никакие объекты не могут быть достигнуты следуя полям неизменного объект. Содержание неизменного поля объектов и любые объекты достижимы из неизменного объекта не должен меняться, как только объект построен. За исключением классы библиотеки явно считаются реализовать Immutable, неизменный класс должен удовлетворять дополнительному лингвистические ограничения, установленные Verier (x4.4), чтобы обеспечить это имущество. Библиотечные классы, которые не могут быть автоматически проверены и считаются неизменными должны быть тщательно ручная попытка выставить нет возможность модификации их содержание. Обратите внимание, что неизменность делает не накладывать никаких ограничений на какие-либо локальные переменные определены в неизменный класс. Это также ничего не говорит об изменчивости аргументов перешел на методы. Это относится только к значения хранятся в объектах и достижимы из неизменного класса полей

Он также вводит полезные понятия бессильных и бескорыстных типов.

3 голосов
/ 21 января 2011

Язык программирования D (версия D2) имеет неизменность.Он имеет ООП, но неизменность - это скорее концепция из функционального пл.Там это называется чистота .

3 голосов
/ 20 января 2011

F # и Scala оба имеют возможность создавать принудительные неизменяемые типы (то есть классы).

Ниже показаны основы F # ...

// using records is the easiest approach (but there are others)
type Person = { Name:string; Age:int; }
let p = { Person.Name="Paul";Age=31; }

// the next line throws a compiler error
p.Name <- "Paulmichael"

Вот эквивалентная Scala. Обратите внимание, что вы все еще можете создавать изменяемые объекты, используя var вместо val.

class Person(val name: String, val age: Int)
val p = new Person("Paul", 31)

// the next line throws a compiler error
p.name = "Paulmichael"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...