美文网首页
Java的可变性(Java Mutation)

Java的可变性(Java Mutation)

作者: christ_yang | 来源:发表于2020-06-10 20:32 被阅读0次

在上一节,我们使用简单的ML小例子,说明了编程语言中无可变性的好处。下面我们使用java语言编写的小例子来进一步体会。

下面代码会有java安全性问题(糟糕的代码)

class ProtectedResource { 
  private Resource theResource = ...;
  private String[] allowedUsers = ...; 
  public String[] getAllowedUsers() {
    return allowedUsers;
  } 
  public String currentUser() { ... } 
  public void useTheResource() { 
    for(int i=0; i < allowedUsers.length; i++) { 
      if(currentUser().equals(allowedUsers[i])) {
        ... // access allowed: use it 
        return; 
      } 
    } 
    throw new IllegalAccessException(); 
  } 
}

通过阅读上面的代码,可以知道因为java允许“可变性”的存在,资源“theResource”能被任何人访问到,而不论该“user”是否在“allowedUsers”数组里面。

说明:
通过调用方法“getAllowedUsers”得到“allowedUsers”数组的别名(或引用);然后将该数组的第一个元素使用当前用户替换掉,我们就可以访问到资源“theResource”了。

p.getAllowedUsers()[0] = p.currentUser(); 
p.useTheResource();

修复

在支持可变性的语言中,可以在恰当的地方复制可能会被重新赋值的绑定,是一个防止可变性副作用的常用预防手段。

public String[] getAllowedUsers() { 
  … // return a copy of allowedUsers
}

相关文章

  • Java的可变性(Java Mutation)

    在上一节,我们使用简单的ML小例子,说明了编程语言中无可变性的好处。下面我们使用java语言编写的小例子来进一步体...

  • Python进阶6

    对象引用、垃圾回收、可变性 Python中的变量是什么 引言 Python和java中的变量本质不一样,java的...

  • Java基础(四)

    Java基础4 JAVA字符 1.String的不可变性 String 是一个对象,一个封装了字符数组的对象。不可...

  • Diagram to show Java String’s Im

    图解java中String的不可变性 翻译自 What is string immutability 定义字符串 ...

  • 泛型

    java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一Java泛型深入理解加泛型面试数组的协变性与范型的不可变性

  • 无可变性的好处(Benefits of No Mutation)

    在ML中,大多数形式的数据是不可变的,即一旦我们创建好该类型的绑定,则无法在后续更改其数据。这也是函数式编程之所以...

  • Java(二)Java基础--03String

    一、字符串的不可变性 图解Java字符串的不变性 二、JDK 6 和 JDK 7 中 substring 的原理及...

  • 基础提高(三):深入分析String

    本章将深入分析在Java中最常用的String类,主要分析以下几个部分: String类的二大特点:不可变性和不可...

  • 关于Java中的不可变性

    1 场景 在面向对象编程里,不变性是一个有点冷门的话题,一般在考察String特性的面试题中比较常见,但其实不变性...

  • 【JAVA】String对象的不可变性

    前置知识 1.java 中有一个 “字符数据池” 的内存管理机制 使用字符串自带的函数改变 string 内容都是...

网友评论

      本文标题:Java的可变性(Java Mutation)

      本文链接:https://www.haomeiwen.com/subject/gmqmzhtx.html