Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以用java编写可变字符串吗?_Java_String - Fatal编程技术网

可以用java编写可变字符串吗?

可以用java编写可变字符串吗?,java,string,Java,String,众所周知,为了安全性和性能,java中的字符串是最终的、不可变的。 但是,我想知道是否有可能编写一个可以修改和继承的通用可变类MyString? 例如: --------更新-------- 我知道有StringBuilder和StringBuffer以及它们的工作原理。在这里,我想知道,如果我编写自己的MyString并在我应该使用String的任何地方使用它,java如何确保安全。如果我能做到这一点,我想就没有安全保险了。是吗 你说得对。如果创建MyString方法并允许继承,那么程序的安全

众所周知,为了安全性和性能,java中的字符串是最终的、不可变的。 但是,我想知道是否有可能编写一个可以修改和继承的通用可变类MyString? 例如:

--------更新--------


我知道有StringBuilder和StringBuffer以及它们的工作原理。在这里,我想知道,如果我编写自己的MyString并在我应该使用String的任何地方使用它,java如何确保安全。如果我能做到这一点,我想就没有安全保险了。是吗

你说得对。如果创建MyString方法并允许继承,那么程序的安全性就不如使用最终的不可变字符串类——如果您未能正确记录重写方法的约定,尤其如此。如果MyString是可变的,那么使用类可能更不可取

继承问题的一个主要示例发生在自使用可重写方法的情况下。考虑一下<代码> java .UTI.ActudiCuff:Cube::删除< /C> >:

从中删除指定元素的单个实例 集合(如果存在)(可选操作)。更正式地说, 移除一个元素e,使得(o==null?e==null:o.equals(e)),如果 此集合包含一个或多个此类元素。如果 此集合包含指定的元素(或等效元素,如果 此集合因调用而更改)此实现 迭代集合以查找指定的元素。如果是 查找元素,它使用 迭代器的删除方法。

粗体部分表示该方法依赖于迭代器方法。抽象集合类是为继承而设计的,因此文档清楚地表明扩展类应该考虑重写<代码>迭代器()/<代码>。未能记录此行为可能会导致客户端不正确地重写方法,从而导致未定义的行为。更糟糕的是,如果您定义使用MyString作为参数的方法,恶意用户可能会传入MyString的子类,从而进一步对您的系统造成意外和潜在的有害更改

可变性是可取的,因为它使您的程序更易于推理。严格不变的对象本质上是线程安全的,并且可以轻松共享。它们还允许缓存字符串以提高性能,但您知道这一点

所以要回答你的问题:如果你愿意,你可以制作一个可变的、非最终的MyString,但你不能保证安全。您只能记录继承,并希望用户表现良好。


资料来源:我的例子显然是从Joshua Bloch的高效Java中偷来的。具体来说,第15项(最小化可变性)和第17项(设计和文档以供继承或禁止继承)是很好的来源

你看过了吗?“编写我自己的MyString并在我应该使用String的任何地方使用它”
String
是最终的,不能扩展。因此,不可能创建一个可分配给
String
的类。您可以使用StringBuilder,当您需要“将其用作字符串”时,调用toString方法,该方法将复制为字符串-但是如果问题是真的,我是否可以将字符串传递到某个API并“从外部”更改内容,答案是否定的(即使你可以,这也很少是个好主意)您到底关心什么?
MyString
String
完全无关-您不能将
MyString
传递给需要
String
的方法,也不能将
String
分配给
MyString
变量。当然,您可以在整个程序中使用
MyString
对象,但为什么不呢有人能这样做吗?这就像问“我能向后开高速公路吗?”-嗯,是的,但为什么。。。。。。
public class MyString {
    private final char[] value;
    public void setChar(int index, char c){
        value[index] = c;
    }
}