Можно ли без каких-либо отрицательных последстий отказаться от открытых геттеров и сеттеров, если те только лишь возвращают/устанавливают значения?

Чёткое определение границ вопроса

Хотя я постарался чётко передать это в заголовке, ещё раз повторюсь, что данный вопрос сфокусирован на следующем сочетании условий:

  • Геттеры лишь только возвращают значение соответствующего поля и ничего больше
  • Сеттеры лишь только устанавливают новое значение соответствующего поля и ничего больше
  • И геттеры, и сеттеры являются публичными

Таким образом ответы типа "сеттеры могут не только устанавливать значение, но и делать ещё что-то" или "сеттер можно сделать закрытым, тем самым сделав конкретное поле доступным только для чтения" не отвечают на заданный вопрос.

Логическое обоснование ненужности геттеров и сеттеров для рассматриваемого случая

При обучении языкам, поддерживающих ООП, обычно говорят что-то вроде:

Хорошим тоном является скрывать поля модификаторами private или protected и получать к ним доступ извне через публичные геттеры и сеттеры.

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

Например, такой Java-класс:

class Person {

 private String name;
 private String email;

  
 public String getName() {
   return this.name;
 }

 public void setName(String newName) {
   this.name= newName;
 } 


 public String getEmail() {
   return this.email;
 }

 public void setEmail(String newEmail) {
   this.email = newEmail;
 }

}

отличается от класса

class Person {

 public String name;
 public String email;

}

лишь только усложнённым способом доступа к полям name и email, но в результате пользователь всё равно может считывать и изменять это поля, потому непонятно, на каком основании часто говорят, что "с геттерами и сеттерами безопаснее".

В C#-таки вообще, существует традиция все поля обкладывать геттерами и сеттерами:

public class Person
{
  public string Name { get; set; };
  public string Email { get; set; };
}

И опять: это что-то реально даёт по сравнению с ниже приведённым кодом, или просто какой-то абстрактный Best practice типа "все так делают, и ты так делай"?

public class Person
{
  public string Name;
  public string Email;
}

Ответы (1 шт):

Автор решения: Max S

Отвечая коротко на ваш вопрос: можно.

Но есть одно маленькое «но». Если такой ваш код будет использоваться в другой сборке, то вы потеряете бинарную совместимость.

Возможно, в будущей версии вашей программы вам всё-таки захочется воспользоваться одним из преимуществ свойств над полями (например, добавить проверку значения, навесить вызов события и т.д.) и вы обернете ваше поле в свойство, пусть даже с тем же именем. В этом случае все сборки, использующие ваш код (вашу сборку), хоть и останутся синтаксически корректными, но перестанут работать до перекомпиляции. Как ваши, так и сторонние, разработчики которых решили воспользоваться вашей сборкой.

Если же в ваших или сторонних сборках использовалась рефлексия в отношении вашего кода, то потребуется не только перекомпиляция, но и, вероятно, исправление кода.

→ Ссылка