java只读类

尽管在一些特定的场合,由clone()产生的本地副本能够获得我们希望的结果,但程序员(方法的作者)不得不亲自禁止别名处理的副作用。假如想制作一个库,令其具有常规用途,但却不能担保它肯定能在正确的类中得以克隆,这时又该怎么办呢?更有可能的一种情况是,假如我们想让别名发挥积极的作用——禁止不必要的对象复制——但却不希望看到由此造成的副作用,那么又该如何处理呢?
一个办法是创建“不变对象”,令其从属于只读类。可定义一个特殊的类,使其中没有任何方法能造成对象内部状态的改变。在这样的一个类中,别名处理是没有问题的。因为我们只能读取内部状态,所以当多处代码都读取相同的对象时,不会出现任何副作用。
作为“不变对象”一个简单例子,Java的标准库包含了“封装器”(wrapper)类,可用于所有基本数据类型。大家可能已发现了这一点,如果想在一个象Vector(只采用Object句柄)这样的集合里保存一个int数值,可以将这个int封装到标准库的Integer类内部。如下所示:
 

//: ImmutableInteger.java
// The Integer class cannot be changed
import java.util.*;

public class ImmutableInteger {
  public static void main(String[] args) {
    Vector v = new Vector();
    for(int i = 0; i < 10; i++)
      v.addElement(new Integer(i));
    // But how do you change the int
    // inside the Integer?
  }
} ///:~

Integer类(以及基本的“封装器”类)用简单的形式实现了“不变性”:它们没有提供可以修改对象的方法。
若确实需要一个容纳了基本数据类型的对象,并想对基本数据类型进行修改,就必须亲自创建它们。幸运的是,操作非常简单:
 

//: MutableInteger.java
// A changeable wrapper class
import java.util.*;

class IntValue {
  int n;
  IntValue(int x) { n = x; }
  public String toString() {
    return Integer.toString(n);
  }
}

public class MutableInteger {
  public static void main(String[] args) {
    Vector v = new Vector();
    for(int i = 0; i < 10; i++)
      v.addElement(new IntValue(i));
    System.out.println(v);
    for(int i = 0; i < v.size(); i++)
      ((IntValue)v.elementAt(i)).n++;
    System.out.println(v);
  }
} ///:~

注意n在这里简化了我们的编码。
若默认的初始化为零已经足够(便不需要构建器),而且不用考虑把它打印出来(便不需要toString),那么IntValue甚至还能更加简单。如下所示:
class IntValue { int n; }
将元素取出来,再对其进行造型,这多少显得有些笨拙,但那是Vector的问题,不是IntValue的错。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 对象
, vector
, 数据类型
, integer
一个
java 只读变量、java只读属性、java pdf文件只读、java pdf文件设置只读、java 只读打开文件,以便于您获取更多的相关知识。

时间: 2024-09-20 06:36:32

java只读类的相关文章

创建java只读类

完全可以创建自己的只读类,下面是个简单的例子:   //: Immutable1.java // Objects that cannot be modified // are immune to aliasing. public class Immutable1 { private int data; public Immutable1(int initVal) { data = initVal; } public int read() { return data; } public boole

java中有类的子类一说,那有对象的子对象一说吗?

问题描述 java中有类的子类一说,那有对象的子对象一说吗? java中有类的子类一说,那有对象的子对象一说吗?新手提问莫见笑. 解决方案 类的子类专业点说叫继承,对象的子对象你可以理解成方法的重写或重载等. 解决方案二: 那是不是类中有内部类就可以呢?

漫谈Java实例化类

  Java 中实例化类的动作,你是否还是一成不变 new 对应对象呢?     经手的项目多了,代码编写量自然会增加,渐渐的会对设计模式产生感觉.     怎样使书写出来的类实例化动作,高内聚,低耦合,又兼具一定的扩展能力呢?     本文试图从几段鲜活的代码入手,给大家呈现不一样的 Java 实例化类.     下面代码取自 com.google.zxing 源码实现: public BitMatrix encode(String contents, BarcodeFormat format

对Java嵌套类的讨论

摘要:与字段和方法类似,Java允许类是其它类的成员.在这里,我们将嵌套类分为4种--嵌套顶级类(nested top-level classes),成员内部类(instance inner classes),本地内部类(local inner classes)和匿名内部类(anonymous inner classes). 在教授Java时,我经常发现学生尝试在方法中声明其它的方法.不过,与Pascal语言不同--Pascal允许嵌套声明过程procedures(与方法类似),而Java是不允

在Java中用类装载框架控制类加载

摘要 通过构建一个能够把Java类装载隔离到一个指定的jar文件中的类装载组件容器框架,你可以确保运行时刻会装载你期望的组件版本. Java的类装载框架强有力且具有灵活性.它允许应用程序存取类库而不必链接到静态的"include"文件.代之的是,它能够从指定位置装载包含库类和资源的档案文件,例如由CLASSPATH环境变量所定义的目录和网络位置.由系统来动态地解析对类和资源的运行时刻参考,从而简化了更新和版本发行.然而,每一个库都有其自己的依赖性集合-并且由开发者和发布人员来保证他们的

Java枚举类用法实例

  本文实例讲述了Java枚举类用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package com.school.stereotype; /** * 活动枚举类型 * @

Java File类的常用方法总结

 这篇文章主要介绍了Java File类的常用方法总结,本文讲解了File类的常用方法,并对一些方法给出了代码示例,需要的朋友可以参考下     Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看一下. 构造函数 代码如下: public class FileDemo { public static void main(String[] args)

java通过solr查询hbase数据,如何自动映射到java实体类?

问题描述 java通过solr查询hbase数据,如何自动映射到java实体类? 现在的情况是,使用simplehbase可以将查询结果自动映射到实体中,但simplehbase的过滤手段不如solr全面,能否将simplehbase与solr结合起来使用?如果可以,该怎么做呢?如果不可以,有没有办法可以达到以下目的?目的:1)可以模糊查询2)查询出的结果自动映射到java实体类中 解决方案 http://www.cnblogs.com/Leo_wl/p/4582018.html

java可变类和不可变类区别中,对于不可变类克隆的问题

问题描述 java可变类和不可变类区别中,对于不可变类克隆的问题 import java.util.Date; public final class BrokenPerson { private String firstName; private String lastName; private Date dob; public BrokenPerson( String firstName, public BetterPerson( String firstName, String lastNa