Могу ли я сделать объект неизменным после вызова конструктора? - PullRequest
0 голосов
/ 23 июня 2011
class X
{
  String x1;
  String x2;
  //...
  String x15;

  public X (Other o)
  {
    // initialize x1,x2,...,x15
  }

  String getx1 () { return x1; }  // lot of getters
  String getx2 () { return x2; }
  //...
  String getx15 () { return x15; }
}

Объект class X инициализируется в конструкторе class Other;

class Other
{
  private X obj;
  // Other members
  public Other ()
  {
    obj = new X(this);
    //...
  }
  //...
}

Я хочу как-то избавиться от множества getter методов в class X. Я могу просто удалить их и сделать все элементы данных X в области default (X используется только внутри пакета).

Есть ли способ, с помощью которого я могу сделать элементы X obj неизменяемыми после вызова конструктора Other? Идея заключается в том, что при использовании get() методов переменные внутри X не могут быть изменены.

obj.getx1();

Теперь, если я использую просто obj.x1, есть вероятность, что он может быть перезаписан (или, по крайней мере, при проверке кода, это будет возражено).

[Примечание: obj должен быть инициализирован только в конструкторе Other()].

Ответы [ 4 ]

2 голосов
/ 23 июня 2011

Если вы объявите переменные-члены как final, то они будут неизменными после конструктора.

2 голосов
/ 23 июня 2011

Вот как вы делаете класс неизменным:

class X {
  private final String x1;
  private final String x2;

  public X (Other o)
  {
    x1 = o.getX1();
    x2 = o.getX2();
  }

  String getX1 () { return x1; } 
  String getX2 () { return x2; }
}

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

  • Геттеры уменьшают связность и позволяют изменять фактические типы реализации полей xn без нарушения клиентского кода.

  • Методы-получатели могут быть переопределены в подклассе, но атрибуты без ключа не могут.

  • Методы получения позволяют использовать объект в качестве "Java-компонента".

А наличие или отсутствие получателей не делает класс неизменным.

1 голос
/ 23 июня 2011

Лучший способ сделать класс неизменным (не неизменяемым) - пометить все поля как final (видимость не имеет значения, может быть public).Поля должны быть инициализированы либо инициализатором:

class A { final int x = 10; }

, либо в каждом конструкторе:

class A { 
   final int x, y, z;
   A(int x, int y, int z) { this.x = x;, this.y = y; this.z = z; }
   A() { this (0, 0, 0); }
}
1 голос
/ 23 июня 2011

Методы получения не делают экземпляр изменяемым. Это будет setter методов. Ваш X, как определено, уже неизменен & mdash; ничто не может изменить x значения экземпляра, они могут быть извлечены только через геттеры.

Если вы спрашиваете, как избавиться от методов-получателей и разрешить прямой доступ к переменным-членам: любая приличная JVM встроит эти функции-получатели через свой JIT-компилятор, сделав вместо этого прямой поиск членов. Поэтому, если вы сохраняете получателей, вы сохраняете гибкость для изменений в режиме реального времени, практически без затрат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...