Java 分离方法和最终变量

Java separate methods and final variables

我有一个名为 Finestrella.java 的 Java class,我在其中声明了两个私有变量:

private File selectedPDF
private String selectedPDFName

在 main 中,我有以下代码,一旦单击按钮,就会将这些变量与 ActionListener 一起使用:

JButton btnNewButton = new JButton("Select PDF File");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                JFileChooser fc = new JFileChooser(System.getProperty("user.home") + System.getProperty("file.separator") + "Desktop");
                fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
                FileNameExtensionFilter filter = new FileNameExtensionFilter("Select a PDF Document", "pdf");
                fc.setFileFilter(filter);
                fc.setAcceptAllFileFilterUsed(false);
                int returnVal = fc.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    selectedPDF = fc.getSelectedFile();
                    selectedPDFName = selectedPDF.getName();
                } else {
                    // Executed when no file selected
                }
            }
        });

由于这只是全部代码的一部分,我考虑将其全部放在另一个名为 Functions.java

的 class 中
static public void setPDF (JFrame myFrame, File selectedPDF, String selectedPDFName) {
    // the code I wrote before
}

并在 Finestrella.java 中调用它:

Functions.setPDF(myFrame, selectedPDF, selectedPDFName);

当然,我得到一个错误,因为它说 selectedPDF 和 selectedPDFName 必须声明为 final。问题是,变量是在 Finestrella.java 中创建的,但我的方法是在 Functions.java 中。此外,我需要这两个变量以便稍后在将在 Finestrella.java 中调用的其他方法中使用,但实际上它们在另一个 class.

我尝试做的事情:

但我没有运气。我明白什么是最终变量,但在这一点上,我认为我的程序结构肯定有问题。我想要实现的是拥有一个干净的 main() 方法,其中仅包含位于另一个 class.

中的基本函数调用

我建议你写一个方法 returns a File:

public static File setPDF (JFrame myFrame) {
    ...
    return fc.getSelectedFile();
}

并如图所示使用它:

selectedPDF = setPDF(...);
selectedPDFName = selectedPDF.getName();

然后你应该提取你的内部 class 并从新的 class 中获取字段;出现该错误的唯一原因是它 必须 final 才能访问内部 class 中的字段。像,

static class MyListener implements ActionListener {
    private File selectedPDF;
    private String selectedPDFName;

    public File getSelectedPDF() {
        return selectedPDF;
    }

    public String getSelectedName() {
        return selectedPDFName;
    }

    public void actionPerformed(ActionEvent arg0) {
        JFileChooser fc = new JFileChooser(System.getProperty("user.home")
                + System.getProperty("file.separator") + "Desktop");
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "Select a PDF Document", "pdf");
        fc.setFileFilter(filter);
        fc.setAcceptAllFileFilterUsed(false);
        int returnVal = fc.showOpenDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            selectedPDF = fc.getSelectedFile();
            selectedPDFName = selectedPDF.getName();
        } else {
            // Executed when no file selected
        }
    }
}

然后

JButton btnNewButton = new JButton("Select PDF File");
MyListener my = new MyListener();
btnNewButton.addActionListener(my);

您可以通过实施 ActionListener 简单地创建一个新的 class。这样,您就可以拥有自己的 class 来处理 Action 项目。

public class MyActionItem implements ActionListener {

    private File selectedPDF
    private String selectedPDFName

    // Usual defs
    public void setPDF(JFrame myFrame, File selectedPDF, String selectedPDFName){
    // Your working code
}

...
...
...

}

我在这里没有使用静态方法,但是使用静态方法是可以的,因为您的 class 设计不需要您实例化操作 class 来使用 setter 方法。

在大型和模块化 Swing 应用程序中,使用您自己的操作项而不是 lambda(即内部 classes)是隔离行为的好方法,也更易于阅读和调试。希望这是有道理的(也能回答你的问题)。