Java 在这段代码中使用这些匿名块调用超类方法的原因是什么?

Java 在这段代码中使用这些匿名块调用超类方法的原因是什么?,java,javafx,javafx-8,Java,Javafx,Javafx 8,昨天我在下面的链接上看到了oracle站点上的组合框示例: 在本页的“将单元格工厂应用于组合框”部分下有一个示例。在本例中,我粘贴了一个代码:- priorityComboBox.setCellFactory( new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call

昨天我在下面的链接上看到了oracle站点上的组合框示例:

在本页的“将单元格工厂应用于组合框”部分下有一个示例。在本例中,我粘贴了一个代码:-

priorityComboBox.setCellFactory(
            new Callback<ListView<String>, ListCell<String>>() {
                @Override public ListCell<String> call(ListView<String> param) {
                    final ListCell<String> cell = new ListCell<String>() {
                        {
                            super.setPrefWidth(100);
                        }    
                        @Override public void updateItem(String item, 
                            boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item);    
                                    if (item.contains("High")) {
                                        setTextFill(Color.RED);
                                    }
                                    else if (item.contains("Low")){
                                        setTextFill(Color.GREEN);
                                    }
                                    else {
                                        setTextFill(Color.BLACK);
                                    }
                                }
                                else {
                                    setText(null);
                                }
                            }
                };
                return cell;
            }
        });
现在我的问题是为什么他们使用匿名代码块来做这件事。他们可以将该语句放入updateItem方法中。

这样做的目的是什么?

假设您可以将其插入到updateItem方法中,但每次更新项目时都会调用它

这对于setPrefWidth来说可能不是什么大问题,因为没有任何变化,但假设您有类似于
firstInitialize()的东西不应该被多次调用

因此,可以使用初始值设定项块。否则,您必须在首先检查的位置添加一个变量,如
bool isInitialized
,如果该变量为真,则执行操作

您还可以查看:

{
  super.setPrefWidth(100);
}