`
fixopen
  • 浏览: 83333 次
文章分类
社区版块
存档分类
最新评论

String的length

阅读更多
Java有一个叫做String的类,可以通过length得到String对象的长度。
现在我要问一个问题,三秒钟给出答案:
这个length是属性(Field)还是方法(Method)。
1、2、3。
你说是属性?
你确认你说的对么?我们可以int n = String.length;但是不可以String.length = n;Why?你见过那个类的某个属性只可读不可写过?
或许你能联想到JavaBean里面的某些规定。确实,有了JavaBean规范,我们可以实现这样一个可读不可写的Property。但问题是String不是一个JavaBean。所以,这里的String是一个不能用Java语言规范给出的类。
C# 的readonly给出了一个比较好的解决方案。但是也有瑕疵,问题在于如果我想修改这个Field,运行时就会阻止这件事情发生,当然,对于 Immutable型的类型来说似乎没有太大的危害,但是mutable型的类型就会有问题了,而且,支持Immutable型类型的语言如果没有GC的支持会非常的丑陋。所以,无论是Java还是C#,解决这个问题的办法不外是一套规范,一套规定如何读取和写入状态的机制。Java用JavaBean解决,C#用Propery解决。看起来很完美。
但是,它们都显得有点重量级,有必要么?C++/CLI甚至规定了更智能的Property方案。节省了大量的无聊的动作和死气沉沉的重复。这是一个明显的改进,但是似乎没有多少人欣赏。
注:实际上C++在很多方面可以说比Java、C#显得更高级,比如说析构的自动调用,这在C#中需要用using来指明,而Java中更是需要用 finally来实现。这导致了它们的哲学(看待世界的方法)的不同,RAII是C++里面自然的和有益的模式,在Java里面蜕化成try finally,更进一步的影响到Java的class的表达能力,不能用来表达资源(非托管型的)!当然,C++的这种包揽也让很多人觉得不爽,觉得控制的粒度不能更细致,以至于(在概念中)可能会影响表达能力。
还是返回到length问题上,这个问题就没有更好的办法了么?
我们从 Eiffel中发现了一种令人称奇的简单的难以置信的方案。那就是:所有的状态特征(Eiffel没有区分属性和方法,统一叫做特征),都是可以读不可以写的,所有的在别的语言中称作方法的那种行为特征分为两类,query和command,其中query跟状态特征一样,不会修改对象的状态,只会返回对象的状态,当然,这可能是通过过滤或者汇总统计之后的状态。而command是用来修改对象状态的那种行为特征。Eiffel甚至特意让没有参数的 query不用()来调用,使得用户没有办法区分query跟状态特征的区别。
这儿似乎让很多人迷惑,这怎么实现信息隐藏!?
哦,是啊,确实,没有办法实现。可是我们要考虑的另一个问题是:我们为什么要实现信息隐藏?
好多人都会立即列举出一大堆理由来,这是他们上软件工程课程的时候记熟了的。可是我要说的是,这一大堆的好处跟信息隐藏没有关系!下面我慢慢的说为什么。
信息存在在计算机空间的目的不是隐藏,而是展现。那为什么我们听熟了听惯了信息隐藏?我想这是一个词语的误用,我们要的是无关信息的隐藏,要的是实现细节的隐藏。细节的无关的信息隐藏对于计算机用户来说是有好处的,但是对于程序员来说,用户认为无关的细节的信息,很有可能恰恰是其关注的焦点信息。从另一个方面来说,我们可以区分出实现细节和用户关注点这两个方面。需要隐藏的是实现细节,而不是大而化之的信息。由于计算机空间内部也有可能是分阶层和等级的,所以,也可以区分出供应者和用户这样的关系,他们也是通过某种定义严格的接口(用户关注点)来隔离和交互的,实现的细节一样被隐藏起来。
说到这儿,很多人还是觉得没有说服力,他们坚持认为应该隐藏数据,而展现方法。怎么说服呢?我们想想Brooks在《人月神话》中怎么说的:给我流程图,我还是不明白,给我数据表格,一切都清楚了。这说明什么?说明人对于信息或者状态的感受能力强过对于操作流程的感受能力,人更能理解的是数据而不是方法。
如果方法是作为一个数据展现的间接层存在,我们也可以说它确实提供了某种程度的灵活性,可是,我们真的需要这种灵活性么?我们的大多数get* set*还不是堕落成为简单的赋值和返回?
分享到:
评论

相关推荐

    Arduino项目开发 Strings_StringLength_StringLength.pdf

    在Arduino项目开发中,理解和掌握如何使用`String`类中的`length()`方法是至关重要的。`length()`函数用于获取`String`对象中的字符数量,它返回一个整数值,表示字符串的长度。本教程通过示例代码详细介绍了如何在...

    stringLength.js

    返回字符串的长度。 需要两个参数:第一个为字符串;第二个为统计类型(cn:不论中英文一个字符记一个数;en:英文字符为一个字符中文为两个字符)

    MATLAB程序 源程序 xasdgnhmtukym

    stringlength=8; dimension=2; popsize=10; pm=0.05; pop=initial_pop(popsize,stringlength,dimension); pop=fitness_calculation(pop,stringlength,dimension,x_bound); [number,k]=max(pop(:,stringlength*...

    String length-crx插件

    "String length-crx插件"是一款专为计算文本长度和字节计数而设计的浏览器扩展程序,适用于英语和俄语环境。这款插件的主要功能是帮助用户快速、方便地获取文本中的字符数量和字节信息,对于网页编辑、内容创作、...

    java中length和length()的区别

    System.out.println("String length: " + a.length()); // 输出 9 List<Object> array = new ArrayList(); array.add(a); System.out.println("List size: " + array.size()); // 输出 1 } ``` #### 六、其他...

    C++中string转换为char*类型返回后乱码问题解决

    问题来源: 在写二叉树序列化与反序列化时发现序列化函数为...第一种:定义一个char数组,数组长度为stringlength+1,将string的内容依次赋值给char数组,最后加上’\0′ ,然后返回char数组名就行了。 第二种:将st

    LinkString.rar_ LinkString_LinkString

    throw std::runtime_error("Shift count exceeds string length"); } Node* temp = head; for (int i = 0; i ; ++i) { temp = temp->next; } Node* prev = head; for (int i = 0; i < length() - n; ++i) ...

    string-length:获取字符串的真实长度-通过正确计算星号并忽略ansi转义码

    const stringLength = require ( 'string-length' ) ; ':horse_face:' . length ; //=> 2 stringLength ( ':horse_face:' ) ; //=> 1 stringLength ( '\u001B[1municorn\u001B[22m' ) ; //=> 7 有关的 此模块的CLI ...

    字符串(汉字)长度判断

    if(string==null || string.length()==0){ return sum; } for (char charAt : string.toCharArray()){ sum++; if(isChinese(charAt)){ sum = sum+shuJuKuHanZhiChangDu; } } return sum; } /** * 根据...

    jni 构造字符串

    jstring javaString = env->NewString((const jchar *) nativeString, stringLength); // 检查错误 if (javaString == NULL) { throwException(env, "java/lang/OutOfMemoryError", "Failed to create Java ...

    string-length-the-hard-way:如果想在Lua中获取字符串的长度,该怎么办?

    然而,如果你遇到了一个名为"string-length-the-hard-way"的问题,这可能意味着你正在寻找一种非标准或特殊的方法来计算字符串长度,或许是出于某种特定的需求或者是在特定的环境中,比如在PICO-8这种资源有限的环境...

    【ASP.NET编程知识】ASP.NET MVC5添加验证(4).docx

    在本文中,我们将学习如何使用 ASP.NET MVC5 添加验证,包括使用数据注解、 RegularExpression 验证、StringLength 验证、Range 验证、Required 验证等。 使用数据注解 在 ASP.NET MVC5 中,我们可以使用数据注解...

    C语言编程技术实践2020版 常见编译错误与调试文档10.doc

    代码清单10.20中,`StringLength`函数接受一个字符指针,而`m=StringLength(&a);`传递了数组的地址。在C语言中,数组名本身就是其首元素的地址,所以应改为`m=StringLength(a);`或`m=StringLength(&a[0]);`。 4. *...

    struts2基于xml验证(最常用的三种类型String、Date、int验证).doc

    - **长度限制**:通过`stringlength`验证器来限制字段的最小和最大长度。例如: ```xml <field-validatortype="stringlength"> <paramname="minLength">6 <paramname="maxLength">10 <message>id必须在${...

    VB 变量做形参实例

    当调用`StringLength`函数时,`myString`的值被传递给`strInput`,然后函数计算并返回字符串的长度。 五、参数传递方式 VB支持两种主要的参数传递方式: 1. ByRef:默认方式,实际参数的地址被传递,函数或过程...

    ios开发的简单计算器

    int length = [string length]; self.j = [[self.Number.text substringFromIndex:length+1] floatValue]; switch (self.counter) { case 1: self.i = self.i*self.j; break; case 2: self.i = self.i+self....

    C语言求两个字符串的最长公共子串

    本文实例讲述了C语言求两个字符串的最长公共子串的方法。...int stringLength(char * str); void main(){ char str1[50]; char str2[50]; char str3[50]; gets(str1); gets(str2); getCommon(str1,str2,str3);

    AmazonRedshift数据库装载机aws-lambda-redshift-loader.zip

    aws-lambda-redshift-loader 是在 AWS Lambda 上实现的 Amazon Redshift 数据库装载机。有了 AWS Lambda 这个函数,将文件数据传入 Amazon Redshift 会变得相当容易。你只要简单地将文件推到 Amazon S3 的各个位置上...

    基于MATLAB的遗传算法实现

    pop(:,stringlength+2)=fun(pop(:,stringlength+2)); ``` 这里`fun`是一个映射函数,将基因值映射到适应度值。变异函数通过在一定概率下改变染色体上的基因值来实现。 在MATLAB中实现遗传算法需要掌握MATLAB编程...

    Java中将一个字符串拆分为多个子字符串.docx

    int stringLength = s.length(); // ArrayList对象用于存储字符串s的所有子字符串 ArrayList<String> subStringList = new ArrayList<String>(); // 第一个for循环,遍历字符串的每个字符作为子串的起始点 for...

Global site tag (gtag.js) - Google Analytics