[分享] 改变 public static final String obj 的值的步骤
[分享] 改变 public static final String obj 的值的方法
这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个
------解决方案--------------------
这叫什么改变呢,只不过是进行了深拷贝而已吧
------解决方案--------------------
违背了String是不可变类设计的初衷了!
想法确实很特别。。
------解决方案--------------------
![[分享] 改变 public static final String obj 的值的步骤 [分享] 改变 public static final String obj 的值的步骤](/default/index/img?u=aHR0cDovL3d3dy5teWV4Y2VwdGlvbnMubmV0L2ltZy8yMDEyLzEyLzIyLzEzMTkwMjQ0NS5naWY=)
------解决方案--------------------
我吐,这也被推荐了。
这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个
你设计成get方法来获取该值,设计一个具有“访问权限”的set方法,o了。你上面的反射,你可以用,人家照样可用,说来说去就是一种垃圾设计。
------解决方案--------------------
主要想表达的意思是,你可以使用反射感觉上好像可以限制,难道还能限制别人用反射么???
抱歉,激动啦。
------解决方案--------------------
这里的设计我觉得楼主可以参考一下开源框架的设计(Struts2),Constants定义就是一些keys,这些key在整个应用程序是不变的,然后根据这些key去取得对应的value。
------解决方案--------------------
呵呵,不错,但是没有很多的意义!
------解决方案--------------------
这样的设计就是为了不改变obj的值。
但是,规则都是限制别人的。不想让别人改变,有时候自己却想改变。
不纠结为什么要改变它,如果你真的想改变,实验下这个
/**
* 重新设置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了。你上面的反射,你可以用,人家照样可用,说来说去就是一种垃圾设计。
------解决方案--------------------
主要想表达的意思是,你可以使用反射感觉上好像可以限制,难道还能限制别人用反射么???
抱歉,激动啦。
------解决方案--------------------
这里的设计我觉得楼主可以参考一下开源框架的设计(Struts2),Constants定义就是一些keys,这些key在整个应用程序是不变的,然后根据这些key去取得对应的value。
------解决方案--------------------
呵呵,不错,但是没有很多的意义!
------解决方案--------------------
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";