为什么我们不应该在Java中使用受保护的静态

资源:

我正在解决这个问题,有没有一种方法可以覆盖Java中的类变量?第36条反对意见是:

如果您看到protected static,请运行。

谁能解释为什么protected static皱眉呢?

B队:

这是一个风格上的问题,而不是直接的问题。这表明您没有正确考虑班上正在发生的事情。

考虑一下什么static意思:

这个变量存在于类级别,它在每个实例中并不单独存在,并且在扩展我的类中没有独立存在

考虑一下什么protected意思:

该变量可以在此类,同一包中的类以及扩展我的类中看到

这两种含义并不完全互斥,但非常接近。

我唯一可以看到的是可以将两者一起使用的情况是,如果您有一个设计为可扩展的抽象类,然后扩展类可以使用原始对象中定义的常量来修改行为。这种安排很可能最终会非常混乱,并表明类的设计存在缺陷。

在大多数情况下,最好将这些常量公开,因为这会使所有内容变得更清洁,并使子类的子类具有更大的灵活性。在很多情况下,组合比继承要好得多,而抽象类则强制继承。

要查看一个示例,说明如何破坏事物并说明变量没有独立存在的含义,请尝试以下示例代码:

public class Program {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(new Test2().getTest());
        Test.test = "changed";
        System.out.println(new Test2().getTest());
    }
}

abstract class Test {
    protected static String test = "test";
}

class Test2 extends Test {
    public String getTest() {
        return test;
    }
}

您将看到结果:

test
changed

自己尝试一下:https//ideone.com/KM8u8O

该类Test2可以test从其访问静态成员Test而无需限定名称-但它不会继承或获取其自己的副本。它正在查看内存中完全相同的对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不应该使用Spring MVC控制器@Transactional?

为什么我不应该在继承中使用平等?

为什么我们不应该在py脚本中使用sys.setdefaultencoding(“ utf-8”)?

为什么我们应该在线程中使用Join?

为什么我不应该在PHP中使用mysql_ *函数?

Oracle是否有官方文档说我们不应该在新项目中使用java.util.Date

为什么我不应该在Java8中的Optional上使用基于身份的操作?

为什么不应该在python中使用list.sort

为什么不应该在财务交易中使用nosql

为什么我不应该在ARMv6 +的系统内存上使用ioremap?

为什么不应该在ES6中使用全部导入

为什么我不应该在React Redux中使用toJS()?(mapStateToProps)

什么时候以及为什么我们应该在角度使用View Encapsulation

为什么不应该在PHP中使用mysql_ *函数?

GraphQL:为什么我们不应该使用“查询”来写数据

什么时候我们应该在.exs文件中使用defmodule

为什么我们应该在退货声明中使用{}

什么时候我们应该在Rust中使用包装与期望

为什么我们不应该在同一层使用多个激活功能?

为什么我不应该在Android中使用System.out.println()

为什么有人不应该在命令行中使用密码?

为什么我的函数返回零为什么它不应该在 R 中

我们什么时候应该在 CodeIgniter 中使用核心?

为什么我们应该在下面的代码中使用模板包装器?

为什么我们不应该在 ComponentDidMount 中设置状态

Android - 为什么我们应该在片段中使用 saveInstanceState 包而不是片段参数?

为什么我们应该在 git commit 命令中使用 -m?

为什么我们不应该直接使用默认 QoS?

为什么我们应该在子组件中使用时将 props 写在花括号中