switch语句需要的常量表达式

时间:2016-03-15 17:15:08

标签: java

我只是想通过switch语句获取事件源,但我不能。我得到了:

  

需要常量表达

我做错了什么?它甚至可能吗?

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener {

    JButton poteguj;
    JLabel podstawa, wykladnik, wynik;
    JTextField tPodstawa, tWykladnik;
    JCheckBox odwroc;
    int liczba1, liczba2;
    long wynikLiczb;

    public Main() {
        setTitle("Poteegpowanie");
        setSize(400, 250);
        setLayout(null);

        podstawa = new JLabel("Wprowadz podstawe:");
        podstawa.setBounds(20, 40, 150, 20);
        add(podstawa);

        tPodstawa = new JTextField("");
        tPodstawa.setBounds(170, 40, 150, 20);
        add(tPodstawa);

        wykladnik = new JLabel("Wprowadz wykladnik:");
        wykladnik.setBounds(20, 70, 150, 20);
        add(wykladnik);

        tWykladnik = new JTextField("");
        tWykladnik.setBounds(170, 70, 150, 20);
        add(tWykladnik);

        poteguj = new JButton("Poteguj!");
        poteguj.setBounds(130, 120, 100, 40);
        add(poteguj);
        poteguj.addActionListener(this);

        wynik = new JLabel("Wynik: ");
        wynik.setBounds(0, 160, 400, 20);
        add(wynik);

        odwroc = new JCheckBox("Odwroc dzialanie");
        odwroc.setBounds(130, 90, 150, 30);
        add(odwroc);
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        liczba2 = Integer.parseInt(tWykladnik.getText());
        liczba1 = Integer.parseInt(tPodstawa.getText());
        switch(source){
            case poteguj:
                if(!odwroc.isSelected()) {
                    wynikLiczb = (long) Math.pow(liczba1, liczba2);
                    wynik.setText(liczba1 + " do potegi " + liczba2 + " jest rowne: " + wynikLiczb);
                }
                else if(odwroc.isSelected()){
                    wynikLiczb = (int) Math.pow(liczba2, liczba1);
                    wynik.setText(liczba2 + " do potegi " + liczba1 + " jest rowne: " + wynikLiczb);
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

问题是poteguj不是常数。您只能对常量值使用switch。你害怕if,我很害怕。

您也许可以将您的资源放入List并从中提取常量值。

List<JButton> sourceList = new ArrayList<>();
// add your sources in a known order

int sourceIndex = sourceList.indexOf(source);
switch (sourceIndex) {
case 0: // poteguj
    // do something
    break;
case 1: // ???

但这会牺牲教条的清晰度。当问题出现时,if-else if也不错。您的代码应该理想地反映您的问题。

答案 1 :(得分:1)

发生错误是因为poteguj不是switch语句所需的编译时常量。这是the grammar defined in the JLS所要求的。所以没有办法用switch做你想做的事。

幸运的是,很容易将其转换为if语句,如下所示:

if(source == poteguj){
    if(!odwroc.isSelected()) {
        wynikLiczb = (long) Math.pow(liczba1, liczba2);
        wynik.setText(liczba1 + " do potegi " + liczba2 + " jest rowne: " + wynikLiczb);
    }
    else if(odwroc.isSelected()){
        wynikLiczb = (int) Math.pow(liczba2, liczba1);
        wynik.setText(liczba2 + " do potegi " + liczba1 + " jest rowne: " + wynikLiczb);
    }
}

相同的逻辑,编译时没有错误。

您甚至可以使用更多案例进行展开,并保持与switch相同的一般结构:

if(source == poteguj){      //case poteguj:
    // ...
} else if(source == item2){ //case item2:
    // ...
} else if(source == item3){ // case item3:
    // ...
} else{}                    // default:

最后要注意的是,如果您有一个非常大的部分,那么可能表明您应该重新考虑您的设计,因此没有必要。如何做到这在很大程度上取决于你的代码的细节,所以我不知道如何做到这一点的一般答案。但在这种情况下,switch无论如何都不是一个好的解决方案。