如何最小化多个音频代码

How to minimalize multiple Audio Codes

我正在尝试最小化我的多个音频代码。这看起来太糟糕了。我怎样才能将这么多代码最小化为一个清晰易读的代码。

public class Sound {
    public static int playerSound (char[][] gameBoard) {
        try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
            Clip clip = AudioSystem.getClip();
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException lue) {
            System.out.println("Spieler x.wav" + lue.getMessage());
            lue.printStackTrace();
        } catch (UnsupportedAudioFileException uafe) {
            System.out.println("Spieler x.wav" + uafe.getMessage());
            uafe.printStackTrace();
        } catch (IOException ioe) {
            System.out.println("Spieler x.wav" + ioe.getMessage());
            ioe.printStackTrace();
        }
        return 0;
    }
    public static int computerSound (char[][] gameBoard) {
        try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Bot.wav")) ){
            Clip clip = AudioSystem.getClip();
            clip.open(inStream);
            clip.start();
        } catch (LineUnavailableException lue) {
            System.out.println("Bot.wav" + lue.getMessage());
            lue.printStackTrace();
        } catch (UnsupportedAudioFileException uafe) {
            System.out.println("Bot.wav" + uafe.getMessage());
            uafe.printStackTrace();
        } catch (IOException ioe) {
            System.out.println("Bot.wav" + ioe.getMessage());
            ioe.printStackTrace();
        }
        return 0;
    } 

首先,结合你的例外情况:

try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
    Clip clip = AudioSystem.getClip();
    clip.open(inStream);
    clip.start();
} catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
    System.out.println("Spieler x.wav " + e);
    e.printStackTrace();
}

其次,将两种方法中相同的代码移动到单独的 private 方法中:

private static void play(String resourcePath) {
    try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(resourcePath)) ){
        Clip clip = AudioSystem.getClip();
        clip.open(inStream);
        clip.start();
    } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
        System.out.println(resourcePath + ": " + e);
        e.printStackTrace();
    }
}

public static int playerSound(char[][] gameBoard) {
    play("Spieler x.wav");
    return 0;
}

public static int computerSound(char[][] gameBoard) {
    play("Bot.wav");
    return 0;
}

第三,因为你总是 return 相同的值(零),所以 return 值根本没有意义:

public static void playerSound(char[][] gameBoard) {
    play("Spieler x.wav");
}

public static void computerSound(char[][] gameBoard) {
    play("Bot.wav");
}

您从不使用 gameBoard,因此可以从方法中删除该参数:

public static void playerSound() {
    play("Spieler x.wav");
}

public static void computerSound() {
    play("Bot.wav");
}

附带说明一下,您可能不应该在 Clip 播放完毕之前自动关闭 AudioInputStream,因为 Clip 可能仍在读取它:

private static void play(String resourcePath) {
    try {
        AudioInputStream inStream = AudioSystem.getAudioInputStream(
            Sound.class.getResourceAsStream(resourcePath));

        Clip clip = AudioSystem.getClip();
        clip.addLineListener(e -> {
            if (e.getType().equals(LineEvent.Type.STOP)) {
                clip.close();
                try {
                    inStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        clip.open(inStream);
        clip.start();
    } catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
        System.out.println(resourcePath + ": " + e);
        e.printStackTrace();
    }
}