Я хотел бы предложить другой подход из всех ответов, которые я видел здесь. Когда вы думаете об инкапсуляции, полезно также подумать о правиле: «Не запрашивайте у объекта данные, попросите объект работать с его данными».
Вы не дали мне использовать numArray
, я собираюсь притвориться, что вашей целью было создание числового «вектора» из математики (не Java-вектора) в качестве примера.
Итак, вы создаете класс NumericVector, который содержит массив значений типа double. Ваш NumericVector будет иметь методы, такие как multiplyByScalar(double scalar)
и addVector (NumericVector secondVector) для добавления элементов.
Ваш внутренний массив полностью инкапсулирован - он никогда не уходит. Любая операция, выполняемая над ним, выполняется в вашем классе NumericVector с помощью этих «бизнес-методов». Как вы отображаете его после операции на нем? Имейте переопределение NumericVector NumericVector.toString()
, чтобы оно печаталось правильно, или, если у вас есть графический интерфейс, напишите класс «Controller» для передачи данных из вашей модели (NumbericVector) в ваше представление (GUI). Для этого может потребоваться способ потоковой передачи элементов из NumericVector.
Это также указывает на несколько вещей, которых следует избегать: не создавайте автоматически сеттеры и геттеры, они нарушают вашу инкапсуляцию. Вам часто нужны геттеры, но, как уже говорили другие, вы должны заставить свой геттер возвращать неизменную версию массива. Также постарайтесь сделать ваши классы неизменяемыми, где это возможно. Этот метод, о котором я упоминал ранее numericVector.addVector(NumericVector secondVector)
, вероятно, не должен изменять numericVector
, а возвращать новый NumericVector с решением.
Случай, когда этот (и OO в целом) часто терпит неудачу, - это библиотеки - когда вы действительно хотите добавить немного функциональности в ваш массив, но все еще оставляете его как массив общего назначения. В этом случае Java обычно вообще не беспокоится об инкапсуляции, она просто добавляет вспомогательный метод / класс, который может что-то делать с коллекцией / массивом (посмотрите на объект "Arrays" для множества отличных примеров).