Javaコードスタイル

最近高専時代の友人*1Javaのコードスタイルの話をしたら、ちょうど同じ頃にCコードスタイルがあがってた。
てことで便乗(?)して議論の内容をちょっと紹介。


まず、Javaには開き中括弧を独立行に書くスタイルは合わないよねー、とか、匿名クラスってどう書くんだろうねー、とか。
普通はこんな感じ。

component.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // ...
    }
});

独立行に書くスタイルだと、さてどう書くのか。

component.addActionListener(new ActionListener()
                            {
                                public void actionPerformed(ActionEvent e)
                                {
                                    // ...
                                }
                            }
);

・・・さすがにこれはない気がする。

component.addActionListener(
    new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // ...
        }
    }
);

お、ちょっと自然かも。

component.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        // ...
    }
});

これはなんか普通な気がするけど、componentの下に中括弧があるのがなんとも気持ち悪い。でもC#の匿名デリゲートもこんな感じのスタイルだから、多分これなんだろうな。


他にも、try-catch-finallyとか。
普通なら、

try {
    // ...
} catch (SomeException1 e) {
    // ...
} catch (SomeException2 e) {
    // ...
} finally {
    // ...
}

なんだけど、独立行に書くスタイルだとこうなる。

try
{
    // ...
}
catch (SomeException1 e)
{
    // ...
}
catch (SomeException2 e)
{
    // ...
}
finally
{
    // ...
}

もしくは、

try
{
    // ...
} catch (SomeException1 e)
{
    // ...
} catch (SomeException2 e)
{
    // ...
} finally
{
    // ...
}

とてつもなく読みづらい・・・
Javaはキャッチしなければいけない例外があるし、C#みたいにusingステートメント*2がないから、リソースの解放はfinallyブロックで行う必要がある。例えば、

BufferedReader in = null;
try {
    in = new BufferedReader(
            new FileReader(path));
    String line;
    while ((line = in.readLine()) != null) {
        // ...
    }
} catch (FileNotFoundException e) {
    // ...
} catch (IOException e) {
    // ...
} finally {
    if (in != null) {
        try { in.close(); } catch (IOException e) { }
    }
} 

なんて普通に良くあることで、これを変換すると・・・

BufferedReader in = null;
try
{
    in = new BufferedReader(
            new FileReader(path));
    String line;
    while ((line = in.readLine()) != null)
    {
        // ...
    }
}
catch (FileNotFoundException e)
{
    // ...
}
catch (IOException e)
{
    // ...
}
finally
{
    if (in != null)
    {
        try { in.close(); } catch (IOException e) {}
    }
}

・・・長いよ。
と言うことで、Javaに限っていえば中括弧を独立行に配置するスタイルはあまり好ましくない。

*1:彼は今大学生。うらやましい。

*2:usingブロック?C#はワカラン