В то время как jenzz anwser работает для простейшего случая. Это не так, если вы перемещаете курсор перед редактированием текста, потому что, как только вторая буква будет напечатана, она будет перемещена в конец EditText.
Предпочитаю использовать это решение:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
...
int position = et_mobile.getSelectionStart();
et_mobile.setText(f(s));
et_mobile.setSelection(position);
...
}
Это так же просто, как и нарушение инкапсуляции. Другой класс не должен иметь возможности проникнуть в ваш класс и возиться с вещами, даже если вы обобщите этот класс. Откуда, например, Транспортное средство что-то знает об Автомобиле? Вся суть базового класса заключается в предоставлении подклассов, но, как и в случае с чрезмерно защищающим родителем, то, что вы предлагаете, было бы слишком большим.
Все дело в наследовании и инкапсуляции.
Правила видимости Java гласят, что
Конечно, как вы упомянули, в отражении вы можете изменить правила (если это не запрещает SecurityManager)
Я предпочитаю смотреть на это с прагматической и реалистичной точки зрения:
public class Test1 {
private int a = 1;
public static void main(String s[]) {
System.out.println((new Test1()).a);
System.out.println((new Test1()).getA());
System.out.println((new Test2()).getA());
}
public int getA() { return a; }
}
class Test2 extends Test {
private int a = 2;
public int getA() { return a; }
}
Какой синтаксис вы бы предложили Test1
использовать для доступа к закрытому члену a
в Test2
. Когда написано Test1
, Test2
может даже не существовать.
Кроме того, базовый класс (суперкласс) не знает, от которого он унаследован. Чтобы базовый класс узнал, когда он был унаследован, вы должны иметь возможность изменять базовый класс при наследовании от него. Вы предлагаете мне как-то изменить мою локальную копию ArrayList
, когда я напишу:
class MyArrayList extends ArrayList
И что произойдет в тот день, когда я решу запустить свой код на вашем компьютере, получите ли вы мою измененную копию ] ArrayList
, который знает о MyArrayList
, или мне как-то изменить копию на вашем компьютере?
Можно ли как-то решить эти проблемы? Безусловно. Есть ли смысл в этом? Я ничего не вижу.
Чтобы ответить на ваш вопрос об обновлении (поскольку исходный вопрос уже хорошо ответил), цель private - скрыть детали реализации, чтобы эти детали реализации не стали зависимостями. В этом суть объектно-ориентированного программирования - инкапсуляция, гарантирующая, что сложность остается управляемой за счет сохранения различных частей изолированными от их собственной области.
Поскольку класс знает о своей собственной реализации - он определяет ее, нет ничего полезного в ограничении доступа к другие экземпляры, поскольку реализация класса объявляет все частные экземпляры, все эти детали уже доступны.