Как получить эквивалент постоянного указателя c ++ в Java?

StackOverflow https://stackoverflow.com/questions/377795

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top