【问题标题】:What is the best way of accessing instance variable inside class in Java?在 Java 中访问类内部实例变量的最佳方法是什么?
【发布时间】:2014-09-24 14:52:43
【问题描述】:

我刚刚开始学习 Java,它很棒。我需要了解的一件事是,在一个类中,我们可以通过两种方式访问​​实例变量:

class Box {

    // Instance variables
    private int width;
    private int height;
    private int depth;

    // First way
    public void set_volume(int a, int b, int c) {
        this.width = a;
        this.height = b;
        this.depth = c;
    }

    // Second way
    public void set_volume_v2(int a, int b, int c) {
        width = a;
        height = b;
        depth = c;
    }

}

这里,没有 this 关键字和使用它都可以访问实例变量。那么最好的方法是什么?或者它们之间有什么区别?

【问题讨论】:

  • 两者都可以。当字段名称被参数隐藏时,您通常使用 this 关键字。
  • 在您的情况下,两者都是相同的,因为在解析局部变量和实例变量时没有歧义,因为它们的名称不同!有时最好在冗长的方法中使用this,以便更清楚地识别实例变量和局部变量。
  • @Shiva 3 个链接没有回答。顺便说一句,不错的尝试。
  • 对于持有者的一个评论,我得到的 3 个答案都是相同的,他们没有意见不同。所以,这个问题在我看来绝不是一个基于意见的问题。

标签: java oop this instance-variables


【解决方案1】:

使用this 将允许您确保您引用的是实例变量而不是参数,如果它们共享相同的名称。

这通常被认为是实例方法和构造函数中的最佳实践。

否则你的两种方法是等价的。

【讨论】:

    【解决方案2】:

    实例变量应该使用this关键字访问它消除了本地验证的同名混淆。这将忽略以下类型的问题 -

    public void set_volume_v2(int width, int height, int depth) {
        width = width;
        height = height;
        depth = depth;
    }
    

    为了获得更多偏好,将使用本地验证。

    public void set_volume_v2(int width, int height, int depth) {
        this.width = width;
        this.height = height;
        this.depth = depth;
    }
    

    并且 this.width 确保它是实例变量并且宽度是局部变量。

    【讨论】:

    • 在这种特殊情况下,您只需要 this 关键字。引用一个没有它的字段是完全可以的。
    • @Bart 这就是原因。我们应该总是习惯使用this,所以你不需要记住任何情况:)
    【解决方案3】:

    最好的方法是始终使用this

     this.width = a;
    

    这样我们就不会混淆参数名称和实例变量。

    一个容易混淆的小例子是

      public void set_volume_v2(int width) {
            width = width;
        }
    

    因此,当您编写this.width 时,我们明确表示它是实例变量。

    【讨论】:

    • @downvoter 你能评论一下我的错误吗?
    • 这就是为什么所有参数都应该是最终的。如果宽度参数是最终的,您的示例将出现编译错误。顺便说一句,不是反对者。
    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 2012-10-24
    • 2018-05-24
    • 2013-11-18
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多