Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 本地类用于什么方法? public void foo(){ 分类栏{ } 杆b=新杆(); }_Java_Inner Classes - Fatal编程技术网

Java 本地类用于什么方法? public void foo(){ 分类栏{ } 杆b=新杆(); }

Java 本地类用于什么方法? public void foo(){ 分类栏{ } 杆b=新杆(); },java,inner-classes,Java,Inner Classes,我看不出任何情况下,方法本地类是最佳的设计选择。你用过吗?在什么情况下?当我需要连接到不同swing组件的同一事件侦听器的参数化版本略有不同时,我使用了一个或两个,但除此之外,我倾向于使用匿名类而不是命名的本地类 一个简单的例子是 public void attachListeners(final JLabel label) { class ButtonListener implements ActionListener { private String value; pub

我看不出任何情况下,方法本地类是最佳的设计选择。你用过吗?在什么情况下?

当我需要连接到不同swing组件的同一事件侦听器的参数化版本略有不同时,我使用了一个或两个,但除此之外,我倾向于使用匿名类而不是命名的本地类

一个简单的例子是

public void attachListeners(final JLabel label) {
  class ButtonListener implements ActionListener {
    private String value;
    public ButtonListener(String val) { value = val; }
    public void actionPerformed(ActionEvent e) {
      label.setText(value);
    }
  }

  button1.addActionListener(new ButtonListener("value1"));
  button2.addActionListener(new ButtonListener("value2"));
}

我曾在需要键值对而键没有映射到现有类的情况下使用过它。我不想让我的“关键类”在我的方法之外可用

例如,键可以由
员工
日期
组成,值为该员工在该日期的预定小时数。在这种情况下,可能如下所示:

public void doExcitingCalculation() {
    class EmployeeDateKey {
        private Employee employee;
        private Date date;
        // Getters and setters ommited for brevity
    }

    Map<EmployeeDateKey, Double> bookedHours = new HashMap<>();
    Map<Empoyee, Map<Date, Double>> temp = fetchData();
    // This isn't a useful datastructure, so we remodel it
    for (Map.Entry<Employee, Map<Date, Double>> entry : temp.entrySet()) {
        for (Map.Entry<Date, Double> hours : entry.getValue().entrySet()) {
            bookedHours.put(new EmployeeDateKey(entry.getKey(), hours.getKey()), hours.getValue());
        }
    }

    // process data
}
public void doExcitingCalculation(){
类EmployeeDateKey{
私人雇员;
私人日期;
//为简洁起见,建议使用getter和setter
}
Map bookedhurs=new HashMap();
Map temp=fetchData();
//这不是一个有用的数据结构,所以我们对它进行了重新建模
对于(Map.Entry:temp.entrySet()){
对于(Map.Entry小时数:Entry.getValue().entrySet()){
bookedHours.put(newEmployeeDateKey(entry.getKey(),hours.getKey()),hours.getValue());
}
}
//过程数据
}

一个用例是,当您对接口类型为参数的方法进行循环调用时,该方法仅在该方法中使用。因此,您可以定义一个方法本地类,而不是编写一个单独的类。(匿名类方法可能有效,但如果它在循环中,最好创建一个类。)

接口A{public int getValue();}
....
public void processValue(A){}
....
公开作废展示结果(){
类B实现了一个{
int getValue(){
返回值;
}
}

对于(int i=0;i,使用方法本地类可以通过将相关部分放在一起来提高代码的可读性。作为一个精心设计的示例,假设您有一个方法需要创建线程以在后台执行某些操作:

class Test {
 void f() {
    // lots of stuff
    new Thread(new Runnable() {
        public void run() {
            doSomethingBackgroundish();
        }
    }).start();
    // lots more stuff
  }
}
如果没有方法本地类,则必须:

在测试内部创建一个新的命名类来进行后台处理,或者 在单独的源文件中创建一个新的命名类以进行后台处理。 这两个选项都可以通过将相关处理移到源代码树中的其他位置(可能在同一个源文件中,也可能完全在另一个源文件中)来降低代码的可读性。使用方法本地类将处理逻辑保留在使用它的位置


这当然不适用于所有情况,但它在许多常见情况下都非常有用。此类代码通常用于GUI操作侦听器,它们是非常小的类,通常只是将操作方法调用从一个位置传递到另一个位置。

您能提供代码片段吗?很有趣!谢谢。有趣的解决方案。但是类EmployeeDateKey在方法fetchData()中不可见,不是吗?它会导致内联fetchData()方法,这将导致巨大的方法doExcitingCalculation()。这似乎没有任何用处。要么列表没有用处,要么方法设计有缺陷(它没有实际工作)Good catch@Oleksandr.Bezhan,我重写了一些代码,以便更好地解释我的意思。
class Test {
 void f() {
    // lots of stuff
    new Thread(new Runnable() {
        public void run() {
            doSomethingBackgroundish();
        }
    }).start();
    // lots more stuff
  }
}