当前位置: 代码迷 >> J2SE >> [分享] 改变 public static final String obj 的值的方法,该如何解决
  详细解决方案

[分享] 改变 public static final String obj 的值的方法,该如何解决

热度:613   发布时间:2016-04-24 01:57:44.0
[分享] 改变 public static final String obj 的值的方法
这样的设计就是为了不改变obj的值。

但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。

不纠结为什么要改变它,如果你真的想改变,实验下这个

Java code
/**     * 重新设置String的值,不是将obj指向新的地址,而是直接修改obj.value的指向<br/>     * <strong>警告</strong>:obj必须这样申明: String obj = new String();<br/>     * 如果这样申明 String obj= "123";     * changeValue(obj,"abc"),将可能导致虚拟机中所有值为"123"的String变成"abc"     *      * @param obj     * @param newValue     *            新的值。     * @return obj     */    public static String changeValue(String obj,String newValue)    {        char[] _value = newValue.toCharArray();         char[] charArray =Arrays.copyOf(_value, _value.length);        Field field=null;            try        {            field = String.class.getDeclaredField("value");            field.setAccessible(true);            field.set(obj, charArray);                        field = String.class.getDeclaredField("offset");            field.setAccessible(true);            field.set(obj, 0);                        field = String.class.getDeclaredField("count");            field.setAccessible(true);            field.set(obj, charArray.length);                        field = String.class.getDeclaredField("hash");            field.setAccessible(true);            field.set(obj, 0);                    }catch ( Exception e)        {            e.printStackTrace();        }        return obj;            }


------解决方案--------------------
这叫什么改变呢,只不过是进行了深拷贝而已吧
------解决方案--------------------
违背了String是不可变类设计的初衷了!

想法确实很特别。。
------解决方案--------------------

------解决方案--------------------
我吐,这也被推荐了。

这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个

你设计成get方法来获取该值,设计一个具有“访问权限”的set方法,o了。你上面的反射,你可以用,人家照样可用,说来说去就是一种垃圾设计。
------解决方案--------------------
主要想表达的意思是,你可以使用反射感觉上好像可以限制,难道还能限制别人用反射么???

抱歉,激动啦。
------解决方案--------------------
探讨

我是这样用的
Java code

public class Const{
/** WEB应用的路径,末尾加上了"/"。Tomcat配置若为&amp;lt;Context docBase="/foo/bar"
path="<strong>/boo</strong>"&amp;gt;则返回<strong>/boo/</strong> */
……

------解决方案--------------------
呵呵,不错,但是没有很多的意义!
------解决方案--------------------
Java code
public interface LegendConstants {    public static final String LEGEND_HOME = "legend.home";    public static final String LEGEND_I18N_ENCODING = "legend.i18n.encoding";        public static final String LEGEND_RESOURCE_ROOT = "legend.resource.root";        public static final String LEGEND_RESOURCE_PROVIDER_CLASSNAME = "legend.resource.provider.classname";    public static final String LEGEND_TEMPLATE_DIR = "legend.template.dir";        public static final String LEGEND_DEVMODE="legend.devMode";        public static final String LEGEND_THEME = "legend.theme";        public static final String LEGEND_ADMINISTRATOR = "legend.administrator";}
------解决方案--------------------
赞一个,LZ想法确实不错,挑战String“不可变字符序列”
  相关解决方案