我可以使用它,还是会有更好的方法?:
public static <T> void setIfNull(T o, T value) {
if(o == null) {
o = value;
}
}
编辑!:我更改了我的代码(通过阅读我只会'设置'本地变量):
@SuppressWarnings("unchecked")
public static <T> T set(Class<T> clazz, String path, Object value) {
T result = null;
try {
Field field = clazz.getDeclaredField(path);
field.setAccessible(true);
field.set(null, value);
result = (T) field.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
return result;
}
最终编辑:我使用上面“编辑”中的代码解决了问题。
答案 0 :(得分:5)
这是行不通的,因为Java是按值传递的。通话结束后,o
仍具有与之前相同的价值。
您可以将此方法设为返回新值
public static <T> T setIfNull(T o, T value) {
return o == null ? value : o;
}
你必须像这样使用它
o = setIfNull(o, someValue);
但是,我真的没有看到这个方法的重点。我想
if (o == null)
o = value;
更简单,更清晰。
答案 1 :(得分:1)
如果我理解你的问题,你实际上想做的事情是:
class Foo {
private static Bar someStaticField = ...;
public static setStaticFieldIfNull(Bar newValue) {
if (someStaticField == null) {
someStaticField = newValue;
这是你的想法吗?
如果是这样,当然这是可能的(当删除静态关键字时,它也适用于&#34;普通&#34;字段)。
如果是这样的话,那么整个事情就简称为&#34; setter&#34;方法。
&#34;设置器&#34;确实有他们在编程中的位置(你可能想谷歌这个术语);但很多时候,使用setter是一种气味&#34;这可以表明一个值得重新思考和改变的设计。
因此:可能你还有其他一些问题;你应该尝试用你在问题中提出的代码来解释你想要解决的问题。