Как получить эквивалент указателя константы c ++ в Java? - PullRequest
2 голосов
/ 18 декабря 2008

Когда я передаю объект неизменного типа (String, Integer, ..) в качестве финального метода, я могу получить символы указателя константы C ++. Но как я могу обеспечить такое поведение в объектах, которые могут изменяться?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

Все, что я хочу, - это запретить someMethod изменять состояние someObject без внесения каких-либо изменений в someType. Возможно ли это?

Ответы [ 4 ]

5 голосов
/ 18 декабря 2008

В общем случае нет, это невозможно. В очень ограниченном случае вы можете заключить someType в класс, который предоставляет тот же интерфейс (см., Например, Collections.unmodifiableList ()).

Однако нет эквивалента «передавать указатель const, и компилятор позволит вам вызывать только константные функции для него».

2 голосов
/ 18 декабря 2008

Нет, вы не можете предотвратить изменение объекта с помощью его методов setXXX () (или аналогичных). Вы можете передать клон или его копию.

1 голос
/ 18 декабря 2008

Нет, я не думаю, что это возможно. Обычный подход заключается в создании адаптера для SomeType, в котором все методы, изменяющие состояние, генерируют исключение UnsupportedOperationException. Это используется, например, java.util.Collections.unmodifiable * -functions.

Есть несколько подходов к этому:

  • вы можете позволить SomeType быть интерфейсом, а когда вам нужно, чтобы он был доступен только для чтения, просто создайте оболочку, делегирующую все методы чтения исходному объекту и реализующую все методы записи для генерации исключения.
  • или вы можете создать подкласс SomeType, перекрывающий все методы записи

Это, конечно, даст вам проверку во время выполнения, а не во время компиляции. Если вы хотите время компиляции, вы можете позволить SomeType быть интерфейсом (или суперклассом) без методов записи, только чтение.

1 голос
/ 18 декабря 2008

Нет, это невозможно. Вы должны либо передать копию объекта, либо просто полагаться на знание того, какие действия изменяют состояние объекта, и избегать их вызова - компилятор вам не поможет.

...