3

同じ種類のオブジェクトのさまざまな表現があります。それをモノと呼びましょう。「Thing」はマーカーインターフェイスです。ThingFormat0、ThingFormat1、ThingFormat2などはすべてThingを実装するJavaBeansです。(JavaBeansであるため、JSONマーシャラーは自動的にJSONとの間で変換します。)ThingFormat1には、nameやidなどのメンバーがいくつかあります。ThingFormat2には、他のものへのURIリンクがあります。ThingFormat3には、他のものなどのThingFormat1表現があります。

JSONシリアライザーは、URIを自動的に変換する方法を知っています。(toString()とコンストラクターClassName(String string)を使用して変換できるすべてのクラスで機能します。)

URIのように動作するが、マーカーインターフェイスThingを実装するThingFormat0が必要です。

public class ThingFormat0 extends URI implements Thing {}

URIは最終クラスであり、サブクラス化できないため、これは機能しません。

これを行うために私が考えることができる唯一の方法は、デコレータ(URIに機能を追加しないため、非常に縮退した種類のデコレータ)を作成することです。これは、一部の「ダックタイピング」言語では簡単ですが、Javaでは、URIをラップして、必要なURIのすべてのメソッドを実装する必要があるため、より面倒です。もっと簡単な方法はありますか?

4

5 に答える 5

3

私が考えることができる2つの簡単な方法:

  • Eclipseを使用している場合は、自動的に生成された任意のフィールドのデリゲートメソッドを使用できます。
  • URIのソースをThingURIという名前の新しいクラスにコピーします。
于 2009-12-06T04:04:21.337 に答える
2

クラスが継承の代わりに構成を使用できない理由はありますか?

public class ThingFormat0 implements Thing {
  private final URI uri;

  public ThingFormat0(String uri) { this.uri = URI.create(uri); }

  public ThingFormat0(URI uri) { this.uri = uri; }

  public URI getUri() { return uri; }

  @Override public String toString() {
    return uri.toString();
  }
}
于 2009-12-06T15:33:45.683 に答える
1

最終クラスをサブクラス化することはできません。限目。

URIの場合、セキュリティ上の理由からほぼ確実に最終的なものです。つまり、誰かがサンドボックスのセキュリティを破ることを防ぐために、(たとえば)アクセス制御を破壊することを可能にする卑劣なURIのサブタイプを提供します。

そうです、ラッパーやデコレータなどを使用する必要があります。

于 2009-12-06T04:00:38.427 に答える
0
// base class that handles delegation
class BaseThing implements Thing {

   BaseThing(String uri) { ... }

   BaseThing(URI uri) { ... }

   URI getURI() { ... }

   ...
}

class ThingFormat0 extends BaseThing {
   ...
}
于 2009-12-06T16:07:32.587 に答える
0

あなたのThingFormatタイプはURIではないので、これは難しいと思います。これらは URI を公開し、URI に対応できますが、URI にはなりません。おそらく、実装の継承が必要ですが、インターフェイスの継承はここで失敗します。これは適切なis-a関係ではないためです。LSPに失敗します。

たとえば、ThingFormata にスキームまたはフラグメント コンポーネントがあるかどうか、またはベース URI に対して解決できるかどうかを検討してください。これらは URI のファセットと操作であり、たまたま何をするにせよ、 とはあまり関係がありませThingFormatん。

于 2009-12-06T16:39:52.387 に答える