web-dev-qa-db-ja.com

Java)でクラス変数を使用するときに問題が発生しますか?

したがって、私はJavaで適切な時間コーディングを行ってきましたが、最近、コーディング設計に関心のあるクラスを開始しました。以前は、2つのメソッドが同じ変数を編集する必要があるクラスの場合は、変数をクラス変数にします。ただし、明示的なパラメーターを受け取るメソッドを作成し、編集したバージョンを返すことを好む人もいます。これにより、普段と同じ効果ですが、どちらにメリットがあるのか​​迷っていました。

例1:

    public class foo{
        private static String toBeEdited;

        private static void main(String args[]){
            toBeEdited = "Original string";
            editingMethod();
            ... Code that uses the toBeEdited variable with its new value...
        }
        private static void editingMethod(){
            toBeEdited = "Edited String";
        }
    }

例2:

    public class foo{

        private static void main(String args[]){
            String toBeEdited;
            toBeEdited = "Original string";
            toBeEdited = editingMethod(toBeEdited);
            ... Code that uses the toBeEdited variable with its new value...
        }
        private static String editingMethod(String tBE){
            tBE = "Edited String";
            return tBE;
        }
    }

ありがとう!

3
Tyler M

1の利点は低くなります Arity 、引数が少なくなります。数が少ないほど、覚えやすくなります。

2の利点は、効果と依存関係が明確であることです。それが使用される場所は、それが文字列を使用し、文字列を変更することは明らかです。

どちらも読みやすさに影響しますが、2は大きな改善です。1はわずかな改善です。

4
candied_orange

例2の最大の利点は、クラスを不変にすることです。あなたが与えた特定の例は静的メソッドを使用するため、この利点を示すのに最適な例ではありません。最初の例では、静的フィールドを使用していますが、これはIMHO自体は悪い習慣です。

しかし、フィールドが静的でない場合、最初の例はオブジェクトの状態を変更しますが、秒は変更しません。不変オブジェクトはマルチスレッディングにとって特に重要ですが、コードを推論するのも簡単になります。したがって、フィールドとメソッドが静的でなくても、クラスが不変になるため、おそらく2番目のオプションを選択します。

また、そのフィールドがオブジェクトの本質(または主な責任)に固有ではない場合、それはクラスのメンバーであってはならない(別のクラスのメンバーである場合もあります)ことを示すもう1つの理由であり、それがクラスエッセンスに固有である場合、提案したようにクラスを不変にすると、この値が変更されるたびに、新しい値を持つクラスの新しいインスタンスが返され、既存のインスタンスは変更されません。

0
Arnon Axelrod