Java 本地类用于什么方法? public void foo(){ 分类栏{ } 杆b=新杆(); }
我看不出任何情况下,方法本地类是最佳的设计选择。你用过吗?在什么情况下?当我需要连接到不同swing组件的同一事件侦听器的参数化版本略有不同时,我使用了一个或两个,但除此之外,我倾向于使用匿名类而不是命名的本地类 一个简单的例子是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
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
}
}