1

この質問は最初はばかげているように思えるかもしれませんが、さまざまな人と仕事をした後、誰もがそれについて独自のさまざまな知識を持っているように見えるので、ここに私の質問があります.

だから今、私はそれを行うための最良の方法とその理由を考えています(「なぜ」は私にとってより重要です):

Javaコードを記述する2つの方法について疑問に思っています:

  1. 常にオブジェクトを渡しますか、それともプリミティブ データ型を渡すことができますか?
  2. this.nameを使用して、nameまたはgetName()クラス インスタンス内で変数を呼び出しますか?

    public class MyClass {
        private String someStr;
        private int someNumber;
        private Integer someOtherNumber; // int, Integer ? which one to choose ?
    
        public MyClass(String someStr, int someNumber, int someOtherNumber) { // int someNumber ? Integer someNumber ? why ?
            this.someStr = someStr; // Here, it's clearly this.{name} = {name} because of the variable name conflict
            this.someNumber = someNumber;
            this.someOtherNumber = someOtherNumber;
        }
    
        public int someMethod(boolean first) { // Boolean ? boolean ?
            if (first) {
                return someNumber;
            } else {
                return this.someOtherNumber; // this.{name} ? just {name} or even this.get{name}() or get{name}() ? (supposing getters exists)
            }
        }
    }
    

より良いコードを書くために、どちらを使用すればよいかについて、誰かが私に素晴らしい説明を提供してくれることを願っています。

4

7 に答える 7

1

プリミティブ データ型を使用する必要がある場合は、int、double、char、float などを使用する必要があります。唯一の例外は、Java では char 配列を表し、インスタンス メソッドも保持する特別なクラスである String です。 .

Integer と int の場合は、Integer メソッド ( http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html ) を使用する必要がある場合です。ただし、値を保持するためのデータ型のみが必要な場合は、int を選択してください。

于 2013-10-02T08:32:46.953 に答える
1

シンプルにしています。私は を使用していますnameが、同じ名前のローカル変数がある場合は、. 検証などのロジックを実行する場合に使用する必要があります。this.namegetName()getName()

于 2013-10-02T09:00:04.470 に答える
1

それは主に個人のスタイルと原則の問題です。

  1. private int someOtherNumber;それは私にとってintより自然に見えるので、私はほとんどいつも使用しています -おそらくC時代の影響を受けています. また、パフォーマンスとメモリ使用量の観点からは、使用する方が良い選択です。経験則として、正当な理由がない限り、プリミティブにオブジェクトを使用しません。int
  2. return this.getSomeOtherNumber();ゲッター/セッターを使用することを好みます。常にではありませんが、getter メソッドは単純なreturnステートメントではなく、いくつかのロジックをカプセル化することがあるためです。その結果、属性でない限り、クラス属性 (this.someAttrや など) に直接アクセスすることはありません。私を信じてください、それははるかに安全です。someClass.somePublicAttrfinal

続き 2: 少し奇妙に思えるかもしれませんが、Lisp のバックグラウンドが強い私は、ゲッター/セッター メソッド (クラス状態) をできるだけ使用しないようにし、代わりに必要なパラメーターを明示的に渡し、メソッドの戻り値を使用します。次の例を検討してください。

public class C {
  private int a;
  private int b;

  public int getA() { return a; }
  public void setA(int a) { this.a = a; }
  public int getB() { return a; }
  public void setB(int b) { this.b = b; }

  // Usual style
  public void someMethod1(int x) {
    mainLogic1(x);
  }

  private void mainLogic1(int x) {
    b = a + x;
  }

  // My preferred style
  public void someMethod2(int x) {
    setB(mainLogic2(x, getA()));
  }

  private int mainLogic2(int x, int a) {
    return x + a;
  }
}

ご覧のとおりsomeMethod1mainLogic1どちらもコードを見たときに検出するのが難しい副作用があります。一方、mainLogic2副作用はまったくなく、someMethod2見ただけで副作用を簡単に見つけることができます. これはやり過ぎのように思えるかもしれませんが、副作用のない多数の小さなメソッドで構成されているため、Java コードが読みやすく、テストしやすく、リファクタリングしやすくなりました。

于 2013-10-02T09:03:23.793 に答える