2016-06-29 12 views
3

イム好奇心、単純なデータ型の1省略形

int counter = 0; 
counter += 2; 

のような略語フォームオブジェクトのgetter/setterメソッドのためにそこに存在している場合

SimpleObject oSimple = new SimpleObject(); 
oSimple.setCounterValue(oSimple.getCounterValue() + 1); 

情報

getter/setterメソッドが必要です。

追加

言語機能が存在しない場合にはアイデアをサポートしてthatsの、良いときれいなコードのコンテキストでそれに対処するための最も便利な方法は何ですか?

+0

これはScalaでは実行できますが、Javaでは実行できません。 –

+0

'lombok'はゲッターとセッターを宣言する必要がないので、明示的に呼び出す必要があります。 –

+0

'SimpleObject'のソースを管理しているなら、"インクリメント "メソッドを追加して、それが原子的に実行されていることを確認することができます。たぶん[AtomicInteger](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html)(およびその兄弟)をご覧ください。 – Fildor

答えて

1

geert3によれば、Javaでセッター/ゲッターを直接的にアクセスすることはできません。

あなたのケースでは、あなたのSimpleObject級はちょうど方法increaseCounter()、多分increaseCounterBy(int add)(または単にadd(int a))を持っている必要があります。

+0

xtendを使わないための良いトレードオフのように見えますが、単に自分自身が追加されていることを目にするためには、「increaseCounterBy'バックグラウンド。 – DanielK

0

valueは、あなただけの変数を直接参照することにより、それを解決することができ、それを設定するときにコードを実行/任意の間違った値をチェックする必要がない場合は、次の

public Class SomeObject{ 
    public int value; 
} 

public Class Main{ 

    public static void main(String[] args){ 
      SomeObject o = new SomeObject(); 
      o.value += 1; 
    } 
} 
2

あなたは、私が想像することができますC#の背景を持っています;-)

Javaでは(公的なプロパティなどを持っているのとまったく同じソリューションではありませんが)、これは不可能です。演算子のオーバーロードと同じですが、問題が解決されている可能性もあります。

しかし、http://www.eclipse.org/xtend/を見てください.JVMに似たJVM言語で、演算子のオーバーロードやその他の面白いことをサポートしています。

+0

私はいくつかあります。そして、私は単に何かを信じることができなかったので、Javaでは役に立たなかった。ですから、普通はxtend JVM方言を使うのがいいでしょうか? – DanielK

+0

私はこれが行く方法だとは言いません。あなたが自由に行動することができるかどうかを検討するオプションです。私たちのほとんどは、これが不可能であるという事実だけで生きることです。インクリメンタルメソッドは、具体的な問題を回避するための素晴らしい方法です – geert3

+0

また、これは多分宗教的な議論であり、非常に特殊なケースでない限り、C#のゲッター/セッターのコンセプトがプロパティとして「装い」されています。一般的には混乱します。私は言語変換の文脈でそれを見落とす傾向があります(例えば、COBOLをJavaに変換する "+"がJavaの追加だけでなく、2つの非ネイティブ型を追加する必要がある場合)。 – geert3

1

この場合のために、私は注釈

/** 
* Annotation for PropertiesContainer class (that has field without getter and setter) 
* This class look like as class with Properties in C# 
* 
*/ 
public @interface PropertiesContainer { 
} 

を作成するには、どのクラスにも(エラーではありません注釈番組)

@PropertiesContainer // class without getter and setter 
public Class SomeObject{ 
    public int counter; 
} 

そして、ちょうど使用を追加追加:

oSimple.counter++; 
0

あなたが与えた例があなたがしたいことばかりであれば(新しいオブジェクトを作るたびに新しいオブジェクトのインデックスをインクリメントして割り当てる)、次に共通する特定のインデックスのカウンターとローカル変数として静的変数を使用します。

class SomeObject { 

    static int objectCounter; 
    private int index; 

    public SomeObject() { 
     index = objectCounter++; 
     // additional constructor code 
    } 
} 

は、変数に番号を追加したい場合は、私はない別の方法を作るだけではなく)(設定書き換えるためにしようと検討したい、またはそれが理にかなっている場合、それの一部にしますset()のコード。

関連する問題