2016-03-18 3 views
1

は、私がこれを使用することができ、またはより良い方法?:があるだろう、私は(私は唯一のローカル変数を「セット」でしょう読み取りによって)自分のコードを変更し 外部メソッドを使用してオブジェクトを設定することは意味がありますか?これを使う?

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

最終編集:上記の「編集」のコードを使用して問題を解決しました。

+1

このメソッドは、メソッドのローカル参照を 'o'に変更する以外の何も行いません。 – bcsb1001

+0

簡単に言えば、メソッド内に 'o'を設定すると、メソッド内でのみ設定されます。 – bcsb1001

+2

@AndrewTobilko彼は、このコードは何の効果もないことを意味します。おそらく、 "o"は囲むクラスの静的フィールドであるという考えがありました。しかし、囲むクラスに静的フィールド "o"があっても、メソッドパラメータ "o"はそれをシャドーイングしています。したがって、上記のコードはパラメータoを更新するだけです。したがって、この方法は「いいえ」です – GhostCat

答えて

1

私が正しくあなたの質問を理解していれば、あなたが実際のような何かをしたい:

class Foo { 
    private static Bar someStaticField = ...; 

    public static setStaticFieldIfNull(Bar newValue) { 
     if (someStaticField == null) { 
     someStaticField = newValue; 

は何があなたの心を持っているということですか?

これはもちろん可能です(また、静的キーワードを削除する場合は、「通常」のフィールドでも機能します)。

もしそうなら、全体を単に「セッター」メソッドと呼びます。

「セッター」は、プログラミングでその役割を持っています(この用語をGoogleにしたいかもしれません)。しかし、しばしばセッターを使用することは、考え直して変更する価値のあるデザインを示す「匂い」です。

したがって、おそらくあなたには別の問題があります。あなたがあなたの質問に入れたコードを使って解決したい問題を説明しようとするべきです。

+0

実際にあなたは私の意図について非常に正しいです。しかし、「セッター」と「フィールド」の唯一の違いは、2つの異なるクラスにあります。 – Azoraqua

+1

私はOPのバージョンが動作しないと思う、それはあなたとは非常に異なっています(フィールドではなくパラメータがあります)。だから、それはあなたが「可能です」と言っているOPを混乱させ、まったく違うものを見せてしまうかもしれません。 – RealSkeptic

+1

@Experminatorだからこそ私はあなたが解決したい問題について尋ねました。クラスAの静的メソッドを使用してクラスBに属する値を変更することは、「臭い」だけではなく...まったく間違っています。オブジェクト指向プログラミングの考え方は、データのカプセル化です。一部のクラスAに(静的な)フィールドがある場合、クラスAのメソッドだけがそれらのフィールドを操作します。 – GhostCat

5

Javaは値渡しであるため動作しません。呼び出し後、oは以前と同じ値を持ちます。

あなたはこのあなたはしかし、この

o = setIfNull(o, someValue); 

ようにそれを使用する必要があります

public static <T> T setIfNull(T o, T value) { 
    return o == null ? value : o; 
} 

新しい値を返すメソッド作ることができ、私は本当にこの方法ではポイントが表示されません。私は思う。

if (o == null) 
    o = value; 

は、より単純で明確である。

+0

ありがとうございますが、なぜ私はそれが必要なのかを明確にする: 'InstanceUtil.setIfNull(users、ConfigurationManager.load(" users.yml "));' – Azoraqua

関連する問題