java - A.java中有一个私有(private)类 "P"(("P"使用了A.java中的一些方法),B.java如何访问 "P"?

标签 java

好的,我在 Order.java 中有一个 私有(private)类 MyClickHandler。我希望 Customer.java 能够使用 MyClickHandler,但我不想将 private class MyClickHandler 的确切代码复制到 B.java。

但是,问题是MyClickHandler还使用了Order.java中的一些方法。幸运的是,这些方法也需要在 Customer.java 中使用。

订单.java

public class Order{
    private class MyClickHandler implements ClickHandler{
        CheckBox myCheckBox;
        MyTextColumn myTextColumn;
        public MyClickHandler(CheckBox myCheckBox, MyTextColumn myTextColumn){
            this.myCheckBox=myCheckBox;
            this.myTextColumn=myTextColumn;
        }
        @Override
        public void onClick(ClickEvent event) {
            // TODO Auto-generated method stub
            if(myCheckBox.getValue()){
                insertColumn(myTextColumn);
            }
        }
     }
     public void insertColumn(MyTextColumn myTextColumn){
         // This method is also called by other methods in Order.java
     }
     public void removeColumn(MyTextColumn myTextColumn){
         // This method is also called by other methods in Order.java
     }

}

现在我希望 Customer.java 使用 MyClickHandler。此外,还需要使用方法 insertColumnremoveColumn

最佳答案

如果不确切知道这应该做什么,就很难完全清理设计,但作为开始,我会做这样的事情:

  1. 将所有类设为public
  2. 提取常见行为 OrderCustomer 进入父类(super class)(下面名为 Parent - 不好) 名字!)
  3. 只需在 for 中实例化 MyClickHandler 的实例即可 例如,Order,并将对 this 的引用传递给它,以便您可以 以与私有(private)方法相同的方式调用它的方法 类。
<小时/>
public class Parent {

   public void insertColumn(MyTextColumn myTextColumn){
      // implement
   }

   public void removeColumn(MyTextColumn myTextColumn){
      // implement
   }
}

public class Order extends Parent{

    ClickHandler clickHandler;       

    public ClickHandler getClickHandler(CheckBox myCheckBox, MyTextColumn myTextColumn) {
         return new MyClickHandler(this, myCheckBox, myTextColumn);
    }

}

public class Customer extends Parent {

//similar to Order

}

public class MyClickHandler implements ClickHandler {

    private CheckBox myCheckBox;
    private MyTextColumn myTextColumn;
    private Parent parent;

    public MyClickHandler(Parent parent, CheckBox myCheckBox, MyTextColumn myTextColumn){
        this.parent = parent;
        this.myCheckBox = myCheckBox;
        this.myTextColumn = myTextColumn;
    }

    @Override
    public void onClick(ClickEvent event) {
        // TODO Auto-generated method stub
        if(myCheckBox.getValue()){
            parent.insertColumn(myTextColumn);
        }
    }
}

这里你有一个有趣的逻辑组合,被拉出来是有意义的

  • 继承 - 如果您希望在 Order 和 Customer 中实现相同的方法,即概念上属于这些类的常见行为,因此作为通用实现是有意义的父类(super class)中的行为

  • 组合 - 正如您想要在两个地方使用的 ClickHandler 实现一样 - 这是一个概念上完全独立的逻辑模块,应该将其拉出到自己的类中并直接使用其他两个。

关于java - A.java中有一个私有(private)类 "P"(("P"使用了A.java中的一些方法),B.java如何访问 "P"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028760/

相关文章:

java - 当我们使用JPA时,是否有类似于Hibernate的load方法?

java - 新建工程,未生成R.java文件

java - 我可以使用 API 搜索 linkedin 中的任何人还是只能搜索我附近的人?

java - 安卓工作室 : How to import java class from outside the project?

java - Spring Batch如何设置Chunk tasklet中每次调用之间的时间间隔

Java 输入问题 - 如何比较字符串

java - Linux 领域的 "Unable to access jarfile"

java - "Hello, world!"- 无法找到或加载主类

java - Java 的 IndexOf 方法

java - 使用 Arrays.toString() 输出数组元素