首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何禁止用户复制getter返回的引用?

如何禁止用户复制getter返回的引用?
EN

Stack Overflow用户
提问于 2017-07-01 09:08:24
回答 3查看 78关注 0票数 0
代码语言:javascript
运行
复制
public class Bar {
    // Third party class -- I don't want to rely on its current interface.
}

public class Foo {
    private /* not final */ Bar bar;

    public refreshBar() {
        bar = new Bar();  // Old references are now "dead".
    }

    /** Question: The reference this method returns can change. */
    public Bar getBar() {
        return bar;
    }
}


Foo foo = new Foo();

foo.getBar().doThing();  // OK.
Bar bar = foo.getBar();  // BAD - I want this to be forbidden.
bar.doThing();           // ERROR.

如何使BAD行在编译时中断?如果不能做到这一点,那么我如何让它抛出异常呢?它甚至会受到影响吗?

EN

回答 3

Stack Overflow用户

发布于 2017-07-01 09:34:22

很简单。不要暴露Bar,只暴露你想要的任何方法:

代码语言:javascript
运行
复制
public class Foo {
    private Bar bar;

    public refreshBar() {
        bar = new Bar();
    }

    public void doOneThing() {
        bar.firstThing();
    }

    public void doAnotherThing() {
        bar.secondThing();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-07-01 09:39:13

下面是一个用于您的目的的简单包装器的演示:

代码语言:javascript
运行
复制
public class BarWrapper {
    public static void doThing() {
        foo.getBar.doThing();
    }
}

public static void Main( String[] Args) {
    foo.getBar // ERROR: does not import FOO
    BarWrapper.doThing(); // WORKS

}

票数 0
EN

Stack Overflow用户

发布于 2017-07-01 09:46:13

如果Bar是一个接口,您可以为该接口创建一个Proxy对象并返回它。然后,当调用该代理接口上的任何方法时,您可以获取当前的Bar对象,并将调用传递给该实例。

请参阅:Proxy文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44856516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档