Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Локальные переменные? (http://forum.oszone.net/showthread.php?t=294443)

GordonG 25-01-2015 14:50 2461024

Локальные переменные?
 
Часто в чужом коде вижу такие конструкции.

Код:

public class A {

private FieldType field;
...

public FieldType method() {
FieldType result = field;
...
return result;
}

}

Зачем так делать? Это как-то оптимизирует код?

Coutty 25-01-2015 15:13 2461038

Вполне возможно, что в "...." метода method() что-то происходит с переменной field, но изменять её для всего объекта нежелательно. Поэтому её копируют в result, портят и возвращают куда надо.

GordonG 25-01-2015 15:26 2461042

Coutty, так в этом и дело, что её не копируют - это же ссылочный тип.

вот например из исходников libgdx
Код:

public class Group extends Actor implements Cullable {
        static private final Vector2 tmp = new Vector2();
        .....................

        public Actor hit (float x, float y, boolean touchable) {
                if (touchable && getTouchable() == Touchable.disabled) return null;
                Vector2 point = tmp;
                Actor[] childrenArray = children.items;
                for (int i = children.size - 1; i >= 0; i--) {
                        Actor child = childrenArray[i];
                        if (!child.isVisible()) continue;
                        child.parentToLocalCoordinates(point.set(x, y));
                        Actor hit = child.hit(point.x, point.y, touchable);
                        if (hit != null) return hit;
                }
                return super.hit(x, y, touchable);
        }

}

там есть примеры и не для static полей. Вроде и для не final тоже.

ta-lib 26-05-2015 15:33 2511591

Цитата GordonG:
Зачем так делать? Это как-то оптимизирует код? »
В данном случае прямой доступ к полю закрыт, и осуществляется только через предопределенные автором класса методы, что позволяет уменьшить вероятность возникновения ошибок как при разработке класса (и подклассов) так и при использовании экземпляров класса. Если вы забыли - это называется инкапсуляция, один из основополагающих принципов ООП.

Позволю себе привести цитату:
Сводите к минимуму доступность классов и членов

Единственный чрезвычайно важный фактор, отличающий хорошо спроектированный модуль от неудачного,- степень сокрытия его внутренних данных и иных деталей реализации от других модулей. Хорошо спроектированный модуль скрывает все детали реализации, четко разделяя свой АРI и реализацию. Модули взаимодействуют друг с другом только через свои API, и ни один из них не знает, какая обработка происходит внутри другого модуля. Эта концепция, называемая сокрытием информации (information hiding) или инкапсуляцией (encapsulatiori), представляет собой один из фундаментальных принципов разработки программного обеспечения...

Источник: Java Эффективное программирование. Джошуа Блох.


Время: 01:54.

Время: 01:54.
© OSzone.net 2001-