1

This question may seem dumb at first, but after having worked with different person, I see everyone seems to have their own, different knowledge about it, so here's my question.

So now I'm wondering what is the best way to do it, and why ("why" is more important for me):

I'm wondering about two methods to write Java code:

  1. Do you always pass Object or can you pass primitive data type ?
  2. Do you call variables using this.name, name or getName() inside your class instance ?

    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)
            }
        }
    }
    

I hope someone will provide me with a great explanation about which to use in order for me to write better code.

4

7 回答 7

4

你总是传递 Object 还是传递原始数据类型?

您不能传递对象,只能传递对对象的引用。您可以传递原始数据。

您是否在类实例中使用 this.name、name 或 getName() 调用变量?

我不会让它比我需要的更复杂,除非它与局部变量冲突或者我getName()做了一些特殊的事情,但这是风格问题。

于 2013-10-02T08:31:13.523 回答
2

你总是传递 Object 还是传递原始数据类型?

您可以根据需要传递原语或对对象的引用。

您是否在类实例中使用 this.name、name 或 getName() 调用变量?

this用于引用当前对象。如果存在冲突的变量名,并且您想区分对象变量和局部变量,请使用this.

此外,您似乎对原语和 Wrapper 类感到困惑。Wrapper 类提供实用程序方法,尤其适用于集合。

于 2013-10-02T08:32:42.767 回答
1

我保持简单。我正在使用name,但如果我有一个同名的局部变量,我必须使用this.name(我的首选解决方案)而不是getName(). getName()如果它执行某些逻辑(如验证),则必须使用它。

于 2013-10-02T09:00:04.470 回答
1

这主要是个人风格和原则的问题。

  1. private int someOtherNumber;我几乎总是使用它,因为它对int来说似乎更自然——也许受 C 时代的影响。而且,从性能和内存使用的角度来看,使用是更好的选择。根据经验,除非我有充分的理由,否则我不会将对象用作基元。int
  2. return this.getSomeOtherNumber();我更喜欢使用 getter/setter;因为有时(并非总是)getter 方法不仅仅是一个简单的return语句,而是封装了一些逻辑。因此,除非它是一个属性,否则我不会直接访问类属性(如this.someAttror ) 。相信我,它更安全。someClass.somePublicAttrfinal

继续 2:这可能看起来有点奇怪,但我有很强的 Lisp 背景,尽量避免使用 getter/setter 方法(类状态),而是显式传递所需的参数并使用方法的返回值。考虑以下示例:

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;
  }
}

如您所见,someMethod1两者mainLogic1都有副作用,在查看代码时很难检测到。另一方面mainLogic2,根本没有副作用,而且someMethod2副作用更容易通过观察来发现。这似乎有点矫枉过正,但它使我的 Java 代码更具可读性、可测试性和更容易重构,因为它由大量没有副作用的小方法组成。

于 2013-10-02T09:03:23.793 回答
1
    Do you always pass Object or can you pass primitive data type ?

这取决于您的应用程序和您的需求。如果您传递对对象的引用,则可以使用相关类型的方法,这些方法可能更安全和可移植。假设您正在使用 Double 类。Double 有许多经过同行评审和测试的方法,可能对您有所帮助。如果您更喜欢使用原始类型 double,则在比较、验证等操作时需要小心。对于性能问题,您可以查看之前的讨论下面: 为什么人们仍然在 Java 中使用原始类型?

    Do you call variables using this.name, name or getName() inside your class instance ?

当我引用一个类成员时,我更喜欢使用它,因为我认为它有助于其他人阅读我的代码以了解该变量是一个类成员。

最后,无论你喜欢哪种风格,我认为你应该在你的应用程序中坚持下去。

您是否在类实例中使用 this.name、name 或 getName() 调用变量?

于 2013-10-02T09:04:51.557 回答
1

你总是传递 Object 还是传递原始数据类型?

public int someMethod(boolean first) { // Boolean ? boolean ?

}

在下面的示例中,您可以通过booleanBoolean获得同样的成功。在 Java 中,这称为自动装箱

注意要小心,因为当传递一个对象时,它可能是null

您是否在类实例中使用 this.name、name 或 getName() 调用变量?

要看。ifname是一个类成员变量,name如果当前作用域中没有任何其他同名变量,则可以访问它。在这种情况下,您应该使用精确this.name指向类成员变量。也可以使用。这只是风格问题。getName()

于 2013-10-02T08:32:29.457 回答
1

如果您需要使用原始数据类型,那么您应该使用它们,例如 int、double、char、float 等。唯一的例外是 String,它在 Java 中是一个特殊的类,它代表一个 char 数组并包含实例方法.

Integer vs int 的情况是您需要使用 Integer 方法(http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html)。但是,如果您只需要一种数据类型来保存您的值,那么请选择 int。

于 2013-10-02T08:32:46.953 回答