2

私は画像の処理を行っており、私の仕事ではパッケージを使用していますjava.awt.geom。私はクラスを使用していPointます。このクラスは、Point2Ddoubleを返すgetメソッドから拡張して継承します。Pointポイントの整数表現を意味します。

の整数xy値にアクセスするには、公的にアクセス可能な変数と;Pointを使用する必要があります。私の質問はxy

1)インスタンス変数へのパブリックアクセスを許可するのは悪い習慣ではありませんか?例えば。この質問

2)これのより良いデザインはありますか?

4

2 に答える 2

4

はい、それは悪い習慣です(少なくとも今日の基準では)が、これにはいくつかの理由があります...

  1. スーパークラスPoint2Dは可能な限り一般的である必要があります
  2. 下位互換性
  3. 快適

詳細に...

  1. スーパークラスPoint2Dは、2D空間で表現できるあらゆる種類のポイントを表現するために使用される汎用オブジェクトです。ジェネリッククラスとして最大限に活用するには、ポイントは可能な限り最高レベルの精度(つまり、)を可能にする必要がありますdouble。これは、 sを返すメソッドgetX()とメソッドから明らかです。sを使用することにより、任意のサブクラスがこれらのメソッドと互換性を持つことができます。doubleは精度の高い最大のプリミティブJava数値型であるため、他のプリミティブ数値変数を使用するサブクラスは常にそれを次のように返すことができます。精度を失うことなく。したがって、の簡略化されたバージョンと考えることができますgetY()doubledoubledouble

    PointPoint2D、これは精度を維持しませんが、スーパークラスの抽象メソッド宣言に準拠している必要がありPoint2Dます。精度を失うことなく、JVMによって直接intキャストできます。が以外の場合、キャスト中に精度の一部が失われます。(たとえば、大きい値は、大きい数値の一部を切り落とさずに直接表現できないため、にキャストすることはできませんでした)doublePoint2Ddoublefloatintfloat

  2. PointクラスはJava1.0で導入されました。下位互換性を維持するには、ベストプラクティスではない場合でも、これらの変数へのアクセスを維持する必要があります。これは、変数などの他の初期のクラスで気付くでしょう。File.separator

  3. Pointは多くの場所で使用されるクラスであり、それ自体はまだかなり一般的なオブジェクトです。プログラマーが直接参照する方がはるかに簡単/簡単/迅速でintあり、値を取得するたびにキャストすることです(int)getX()intまた、をに変換してから再度doubleに戻す必要がないため、JVMによる処理も高速intです。

より良い設計が必要な場合は、int値にintsとしてアクセスするための追加のメソッドを作成するのがおそらく最善です。つまり、メソッドgetXInt()とを作成しgetYInt()てから、変数を非公開に戻します(下位保持する必要がない場合)。互換性)。

于 2012-11-14T12:28:07.210 に答える
1

1)はい、それは悪い習慣です。PointはJDK1.0で導入されましたが、Javaは常に下位互換性を維持しようとします。そのため、これは過去に変更されていなかったと思います。

とのゲッターがxありyます。の抽象メソッド宣言のため、doubleを返していPoint2Dます。intこれは良いことではありませんが、実際には。であるPointの値が返されるため、安全ににキャストできintます。

2)AWTに対処する必要がある場合は、単にこれを受け入れる必要があります。

于 2012-11-14T12:18:16.183 に答える