【问题标题】:How to use variables in Java? [closed]如何在 Java 中使用变量? [关闭]
【发布时间】:2013-10-08 14:21:46
【问题描述】:

这个问题起初可能看起来很愚蠢,但在与不同的人合作后,我发现每个人似乎都有自己的不同知识,所以这是我的问题。

所以现在我想知道最好的方法是什么,以及为什么(“为什么”对我来说更重要):

我想知道编写 Java 代码的两种方法:

  1. 您总是传递 Object 还是可以传递原始数据类型?
  2. 您是否在类实例中使用this.namenamegetName() 调用变量?

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

我希望有人能给我一个很好的解释,让我写出更好的代码。

【问题讨论】:

  • 问题主题非常不清楚。不应该是“如何在Java中传递变量”吗?另外,我敢说这是一个过于笼统和广泛的问题。如果您单独搜索这些内容,您可以轻松找到答案。
  • 我用谷歌搜索并没有发现任何有用的东西,因此提出了这个问题。该主题可能不清楚,但这是因为我也不清楚如何处理这些(再次,因此是问题)。

标签: java normalization


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复,很有趣。你喜欢的风格的例子正在帮助我做出决定:)
【解决方案2】:
    Do you always pass Object or can you pass primitive data type ?

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

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

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

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

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

【讨论】:

  • 我一般会尝试通过getter调用它们并通过setter设置它们:)感谢您的回复!
【解决方案3】:

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

【讨论】:

  • 清晰准确,我喜欢这样 :) 那么方法签名呢?
【解决方案4】:

您总是传递 Object 还是可以传递原始数据类型?

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

}

在下面的例子中,你可以通过booleanBoolean同样成功。在 Java 中,这称为Autoboxing

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

你在你的内部使用 this.name、name 或 getName() 调用变量吗? 类实例?

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

【讨论】:

  • 主题“自动装箱”:小心null ...你应该仍然知道,你在做什么!
  • 谢谢你,你是对的!我会更新我的答案。
【解决方案5】:

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

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

【讨论】:

  • 字符串是什么的例外?它只是一个类,虽然是不可变的。对 String 进行特殊处理的唯一方法是在 Java 7 中的 case 中。
【解决方案6】:

您总是传递 Object 还是可以传递原始数据类型?

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

你在你的内部使用 this.name、name 或 getName() 调用变量吗? 类实例?

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

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

【讨论】:

    【解决方案7】:

    您总是传递 Object 还是可以传递原始数据类型?

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

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

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

    【讨论】:

    • 您的方法签名是 ...(Integer someVar) 而不是 ...(int someVar) 的原因是什么?一个特定的原因或根本没有原因?
    • @CyrilN。有些人使用Integer 而不是int,因为a)它可以是null,b)使用原语是开发人员并不担心的复杂情况。我倾向于尽可能避免使用包装器,甚至使用原语集合,例如trove,以明确null 不是一个选项,有时是因为它更快。
    • 好吧,再说一遍,没有“你必须那样做”,而是“每个人编写代码的方式都不同”,对吧?
    • @CyrilN。每个人的写作方式都不一样,但我坚信您应该以您认为最简单、最清晰的方式进行设计和编码。花更多的精力尝试取出东西而不是添加东西,您将获得更易于维护且通常更快的代码。
    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多