3

C# には、プロパティと呼ばれるタイプのメンバーが存在します。これにより、メソッド全体を定義する必要がないため、スペースを節約しながら、private フィールドを簡単かつ単純に定義し、単純または複雑な getter および setter を提供できます。Javaにはこのようなものはありません。私が見る限り、一般的なコンセンサスは、それを吸い上げて、プライベート変数の完全なゲッターおよびセッターメソッドを定義することです。

現在、私は次のクラスをいじっています:

public class Property<T> {

    private T value = null;

    public Property(){}
    public Property(T initialValue){
        value = initialValue;
    }

    public T get(){
        return value;
    }

    public void set(T newValue){
        value = newValue;
    }

}

この実装では、getter と setter のみを必要とする単純なプロパティを定義できます。 final Property<String> name = new Property<>("Dog");

または、MSDN が C# 用に提供するもののような、より高度なオプション:

...
public double seconds;

public final Property<Double> Hours = new Property<Double>(){
    @Override
    public Double get() {
        return seconds/3600;
    }

    @Override                                              
    public void set(Double newValue) {
        seconds = newValue * 3600;
    }
};
...

このソリューションの長所と短所は何ですか?

4

3 に答える 3

2

長所はほとんど明らかです。C# のプロパティよりも優れている点をいくつか指摘します。

  1. プロパティの代わりにバッキング フィールドを誤って使用しないように、バッキング フィールドは隠れています。(ただし、必要に応じてバッキング フィールドの使用を簡単に選択できないという欠点があります)
  2. getC# の自動プロパティとは異なり、両方ではなく、またはsetメソッドのみをオーバーライドすることを選択できます。

    public Property<List<String>> MyList = new Property<List<String>>(){
        @Override
        public List<String> get() {
            if (value == null)
                value = new ArrayList<String>();
            return value;
        }
        // set still works
    };
    

ただし、短所があります。

  1. これは Java 言語や一般的なライブラリの一部ではないため、コードを読む人 (将来自分自身を含む) を混乱させる可能性があります。
  2. getおよびsetメソッドの可視性を変更することはできませんProperty<T>。 にアクセスできる場合は、値を取得および設定できます。
  3. あなたが自分のPropertyフィールドを作成しない場合final、それにアクセスできる人は誰でもそれを独自のProperty実装に変更できます。これは便利かもしれませんが、たいていは面倒です。
  4. (これは C# のプロパティと共有される短所です)getおよびsetメソッドに渡される引数を変更することはできません。たとえば、 aとメソッドProperty<MyType>の両方で aを使用することはできません( を拡張しない限り)。set(MyType)set(CompatibleType)Property
  5. ジェネリックを広範囲に使用するということは、実行時に ( type eraseのおかげで)広範囲に使用していることを意味しますObject。このボックス化/ボックス化解除は、プリミティブを使用する場合 (たとえばdoublevsを使用する場合)、パフォーマンスがわずかに低下する可能性があります (ほとんどのアプリでは目立ちませんProperty<Double>)。

ちなみに、Scalaは JVM 上で動作する言語で、ネイティブ機能としてプロパティを含み、Java 版のプロパティ (getter/setter) と相互運用します。基本的に他の誰かがあなたのために Java 言語をハッキングしているので、あなたはそれを調べたいと思うかもしれません。=)

全体として、Java にプロパティーを持たせようとするべきではないと思います。ローマにいるときは、ローマ人がするようにしなさい。ローマ人のやり方が気に入らない場合は、通りを下る (Scala) か、国を横切る (C#) ようにしてください。

于 2013-10-05T23:04:54.807 に答える
1

したがって、名前などの完全な構文は次のようになります。

theObject.name.set("new name");

ポイントは、その名前オブジェクトにどのようにアクセスしているのかということです。それはパブリック/保護されていますそれからそれは上書きされる可能性があります。プライベートですか?とにかく、クラスの外でそれを変更することはできません。

あなたが提案した解決策は、オブジェクトに既にアクセスできる場合にのみ機能し、その時点では解決策は必要ありません。

于 2013-10-05T22:13:58.483 に答える