使用外部方法设置对象是否有意义?用这个?

时间:2016-03-18 20:36:43

标签: java

我可以使用它,还是会有更好的方法?:

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;
}

最终编辑:我使用上面“编辑”中的代码解决了问题。

2 个答案:

答案 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;这可以表明一个值得重新思考和改变的设计。

因此:可能你还有其他一些问题;你应该尝试用你在问题中提出的代码来解释你想要解决的问题。