A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘郑瑞 中级黑马   /  2013-1-18 00:07  /  1644 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

      最近经常使用final字段,final确实存在有一些局限性。尽管数组引用能被声明成 final,但是该数组的元素却不能。这意味着暴露 public final 数组字段的或者通过它们的方法将引用返回给这些字段的类(例如,代码中所示的 Fruit 类)都不是不可改变的。同样,尽管对象引用可以被声明成 final 字段,而它所引用的对象仍可能是可变的。如果您想要使用final 字段创建不变的对象,您必须防止对数组或可变对象的引用“逃离”您的类。要不用重复克隆该数组做到这一点,一个简单的方法是将数组转变成 List,例如代码中所示Food 类:清单暴露数组引用使类成为可变的。
  1. //   下面是例子:
  2. public class Fruit{
  3.   private final String[] names = new String[] { "apple", "orange", ... };
  4.   public String[] getNames() {
  5.     return names;
  6.   }
  7. }

  8. public class Food{
  9.   private final String[] names = new String[] { "rice", "meat", ... };
  10.   private final List namesAsList
  11.     = new AbstractList() {
  12.         public Object get(int n) {
  13.           return names[n];
  14.         }
  15.         public int size() {
  16.           return names.length;
  17.         }
  18.       };
  19.         
  20.   public List getNames() {
  21.     return namesAsList;
  22.   }
  23. }
复制代码
为什么不继承 final 以应用于数组和引用的对象,类似于 C 和 C++ 中 const 的使用那样呢?C++ 中 const 的语义和使用相当混淆,根据它在表达式中所出现的位置表示不同的东西。Java 设法把我们从这种混淆中“解救”出来,但遗憾的是在这个过程中产生出了一些新的混淆。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马