首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >工程封装

工程封装
EN

Stack Overflow用户
提问于 2013-10-18 18:44:39
回答 5查看 180关注 0票数 0

doJob()方法中,B通过getter引用。我个人不赞成这个想法,我更喜欢b.execute(),因为我确信getB()永远不会被修改。

我知道,通过这样做,将远离封装,但是封装B对象不是在这里造成了过度吗?

代码语言:javascript
运行
复制
class A{
    private B b;

    public void setB(B b){
         this.b = b;
    }

    public B getB(){
         return b;
    }

    public void doJob(){
       getB().execute();
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-18 18:46:41

如果通过属性或getter访问B并不重要,只要属性仍然是private (因此,调用getB()是过头的,它当然不会破坏任何设计模式)。

票数 3
EN

Stack Overflow用户

发布于 2013-10-18 18:49:36

在这个场景中,它可能是过分的,因为它是一个简单的对象。但是如果有延迟加载,而您的对象看起来是这样的..

代码语言:javascript
运行
复制
class A{
    private B b;

    public void setB(B b){
         this.b = b;
    }

    public B getB(){
         this.b = this.b ?? new B();
         return this.b;
    }

    public void doJob(){
       getB().execute();
    }
}

那么,通过物业访问您的私人成员并不是过分的做法。

我不知道这是否对您有所帮助,但是如果B是一个依赖项,那么您的对象应该像这样设置,其中IB是具体对象B的接口。这是控制模式的反转,将具体对象B与A分离开来,但对于简单的对象图来说,这也是过分的。

代码语言:javascript
运行
复制
class A{
    private IB b;

    // Use inversion of control
    public A(IB b){
         this.b = b;
    }

    public IB getB(){
         return this.b;
    }

    public void doJob(){
       getB().execute();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-10-18 18:55:53

通过使用getter,您正在最小化风险。如果发现B在一个用例中是null,或者由于新的需求需要初始化B,该怎么办?此模式允许您更新getB(),而不必更改A中的任何其他内容。

代码语言:javascript
运行
复制
public B getB(){
   if(b == null) {
       b = getEntityManger().findB(); // or wherever you wanted to get B from
   }

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

https://stackoverflow.com/questions/19456911

复制
相关文章

相似问题

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