如何防止函数在Java中修改私有变量?

时间:2017-03-23 20:37:15

标签: java android

这绝对让我疯狂。

我有一个Thing类有这种设置:

public class Thing {
    // ...

    private Rect box;
    public Rect box(){ return this.box; }

    public void render(Canvas canvas, boolean selected){
        _p.setPathEffect(null);
        _p.setColor(0x00000000);
        _p.setStyle(Paint.Style.FILL);

        if(this.invisible) {
            _p.setColor(Color.WHITE);
            _p.setStyle(Paint.Style.STROKE);
           _p.setStrokeWidth(3);
            _p.setPathEffect(new DashPathEffect(new float[] {10,20}, 0));
            canvas.drawRect(this.box, _p);
            return;
        }

        if(!ResourceManager.isResource(background)){

            _p.setColor(Color.parseColor(border_color));

            Log.d("Before", this.box.toString());
            canvas.drawRect(Utils.getBorder(this.box(), border_size, border_dx, border_dy), _p);
            Log.d("After", this.box.toString());


            // ...
        }
    }

请注意,box具有私人访问权限和公共getter函数box()

这是Utils类:

public final class Utils {
    public static Rect getBorder(Rect rect, int size, int dx, int dy){
        rect = inflatedRect(rect, size);
        rect.offset(dx, dy);

        return rect;
    }
    public static Rect inflatedRect(Rect r, int d){
        r.set(r.left - d, r.top - d, r.right + d, r.bottom + d);
        return r;
    }
}

您可能已经注意到我正在使用Android的Canvas,因此渲染函数必须有最少的分配。

然而,这是Log给出的内容: enter image description here

是的,私有box正在改变,即使它是从getter传递的。这导致元素的Rect在每次render()调用时迅速增加其大小。

什么是适当的解决方案?

编辑1:此问题完全来自我的Utils.getBorder功能。如果border_size为0或者具有此功能的行已被注释掉,则矩形不会出现异常。 canvas.drawRect(Utils.getBorder(this.box(), border_size, border_dx, border_dy), _p);是代码中唯一出现的问题,并且在项目的其他任何地方都没有使用。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案如下......

public final class Utils {
    public static Rect getBorder(final Rect rect, int size, int dx, int dy){
        Rect inflatedRect = inflatedRect(rect, size);
        inflatedRect.offset(dx, dy);

        return inflatedRect;
    }

    public static Rect inflatedRect(final Rect r, int d){
        return new Rect(r.left - d, r.top - d, r.right + d, r.bottom + d);
    }
}