Java 类中使用的变量阴影是啥?

Posted

技术标签:

【中文标题】Java 类中使用的变量阴影是啥?【英文标题】:What is variable shadowing used for in a Java class?Java 类中使用的变量阴影是什么? 【发布时间】:2010-11-08 16:35:13 【问题描述】:

我正在阅读我的 Deitel,Java How to Program 一书,遇到了 shadowing 一词。如果允许阴影,Java 类中有什么情况或目的?

例子:

public class Foo 

    int x = 5;

    public void useField() 
        System.out.println(this.x);
    
    public void useLocal() 
        int x = 10;
        System.out.println(x);
    

【问题讨论】:

【参考方案1】:

影子的基本目的是将本地代码与周围的类解耦。如果不可用,请考虑以下情况。

API 中的 Foo 类已发布。在您的代码中,您将其子类化,并在您的子类中使用名为 bar 的变量。然后 Foo 发布一个更新并将一个名为 Bar 的受保护变量添加到它的类中。

现在由于您无法预料的冲突,您的课程将无法运行。

但是,不要故意这样做。只有当你真的不关心范围之外发生的事情时才让这种情况发生。

【讨论】:

我喜欢你的最后一点“只有当你真的不关心范围之外发生的事情时才让这种情况发生。” ...当您的实例变量值开始发生奇怪的事情时,您将知道何时开始关心 :))) 无论如何,始终在设置实例值的方法中使用 this.variable_name 是一个好习惯变量...【参考方案2】:

这对于你不想为方法参数创建单独的变量名的设置器很有用,例如:

public void setX(int x) 
    this.x = x;

除此之外,我会避开它们。

【讨论】:

这是隐藏变量的可怕原因。阴影总是让您面临潜在的错误,并且使用范围信息命名变量以及更改参数的名称比包含“this”更容易。每次。 对于一个简单的设置器,就像上面的例子一样,我认为这很好,重命名参数会使事情变得丑陋。比这更复杂的事情,我同意,完全避免。【参考方案3】:

一个主要目的是迷惑人们。这是不好的做法,应该避免。

【讨论】:

你能进一步解释一下 this.x=x 是如何令人困惑的吗?【参考方案4】:

Shadowing 并不是一个真正的 Java 术语。在任何情况下,如果在作用域中声明的变量与在更大作用域中的变量同名,该变量就会被隐藏。

阴影的一些常见用途是当您有内部类和外部类并且想要维护一个具有相同名称的变量时。

如果你可以避免它,你应该避免它,因为它可能会引起混乱。

【讨论】:

【参考方案5】:

两种常见的用法是构造函数和set方法:

public Foo(int x) 
    this.x = x;


public void setX(int x) 
    this.x = x;

如果您希望在单个瞬间获得变量的副本,这非常有用,但变量可能会在方法调用中发生变化。

private void fire() 
    Listener[] listeners = this.listeners;
    int num = listeners.length;
    for (int ct=0; ct<num; ++ct) 
        listeners[ct].stateChanged();
    

(当然,使用豪华的 for 循环不需要一个人为的例子。)

【讨论】:

这两种情况都不需要阴影。 @Rick 没有人谈论它是必要的。不需要阴影。 我是说,一个人永远不应该影子。只是以不同的方式命名变量。 @Rick 这是风格问题。惯例是你应该影子。 不幸的是,这种风格使得像 -Wshadow 这样的工具更难使用。不要选择风格而不是健壮性。

以上是关于Java 类中使用的变量阴影是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?

在 UIImageView 后面创建阴影的最佳方法是啥

向我的 UIView 添加阴影的最佳方法是啥

向 UIView 添加黑色阴影的最佳方法是啥

在 iOS 上做阴影的最快方法是啥?

刺客信条枭雄里面的PCSS选项是啥?