【问题标题】:Accessing fields and methods of object containing 'this' object访问包含“this”对象的对象的字段和方法
【发布时间】:2013-03-05 02:20:39
【问题描述】:

示例代码:

public class A {
    B b = new B();
    int a = 17;
}

public class B {
    int getA() {
        // how to get 'a' field from object containing 'this' object 
    }
}

我的问题与示例代码中的注释相同。一般来说:如何从包含“this”对象的对象访问字段和方法。 在我的示例中,B 类将仅作为 A 类中的字段实例化。

【问题讨论】:

    标签: java contain


    【解决方案1】:

    如果您的出发点是B 中的代码,那么您不能这样做。没有办法找到所有在 VM 中的所有类中都使用了 B 的地方。

    此外,如果您发现自己想要这样做,则表明您需要重新审视您的班级结构。例如,您可能让BB 构造函数中接受A 参数:

    public B(A owner) {
        // ...do something with owner object
    }
    

    不过,这会在 AB 之间引入相当紧密的耦合,这可能是一个问题。您可以改为将 B 需要了解的 A 的各个方面抽象到接口中,让A 实现该接口,并让B 接受使用该接口键入的参数。

    或者避免让B 知道有关A 的任何信息,这通常是最好的。

    【讨论】:

      【解决方案2】:

      试试这个:

      class A {
          B b = new B(this);
          int a = 17;
      }
      

      class B {
          A a;
          public B(A a) {
              this.a=a;
          }
          int getA() {
              return a.a;
          }
      }
      

      【讨论】:

        【解决方案3】:

        创建类B的对象时,需要传递对象Athis的引用:

        public class A {
            B b = new B(this);
            int a = 17;
        }
        
        public class B {
            A mA = null;
            public B(A pA) { mA = pA; }
            int getA() {
                int a2 = mA.a;    
            }
        }
        

        另一种可能性是在类 A 中声明类 B。对于这样的类,在创建封闭类的对象时,对封闭对象“this”值的引用将自动作为隐藏参数传递:

        public class A {
            B b = new B();
            int a = 17;
        
          public class B {
            int getA() {
               int a2 = A.this.a;
            }
          }
        }
        

        请注意,如果您将类B 声明为静态,这会将内部类B 转换为普通的顶级类,并且外部类的this 的值将不再执行。

        【讨论】:

          【解决方案4】:

          您必须存储对 A 实例的引用:

          public class A {
              B b = new B(this);
              int a = 17;
          }
          
          class B {
              public B(A a) {
                  this.a = a;
              }
          
              private final A a;
          
              int getA() {
                  return a.a;
              }
          }
          

          ...或者如果 A.a 是一个常量,那么声明它:

          public class A {
              B b = new B(this);
              public static final int a = 17;
          }
          
          class B {    
              int getA() {
                  return A.a; // but then you could use A.a at the call site anyway
              }
          }
          

          哪种方法最适合您取决于您​​要解决的实际问题。您应该发布您的真实代码以获得进一步的建议。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-08
            • 1970-01-01
            • 1970-01-01
            • 2011-07-30
            • 1970-01-01
            • 2015-01-09
            • 1970-01-01
            相关资源
            最近更新 更多