2011-11-30 9 views
0

私はこのような何かをしたいと思います:Java継承 - 他の子クラスによって子クラスのインスタンスからの値を共有する(同じ)方法

Class A 
Class B extends A 
Class C extends A 

B b = new B(); 
C c = new C(); 

b->setField("foo"); 
c->getField; //return "foo" 

これらのクラスを実装するために何とか可能ですか?

は、私は2つのentitesに実体分割を行うために、休止状態で永続性のためにそれを必要とし、自身のテーブル内の各を持っています。そして、私はいくつかのフィールドを同じにする必要があります(id、いくつかのFK、いくつかの値)。だから、これらのフィールドを1つのサブクラスに設定し、2番目のサブクラスで同じ値を使用したいと思います。すべてのサブクラスは、まったく同じ値を持つ/共有する必要があります。

+0

ありがとうございますか!そうでなければ、オブジェクトbとcはその値をどのように共有するのですか? – Thomas

答えて

1

あなたは、コードの下に使用することができます:

public class A { 

    private static String field; 

    public static String getField() { 
     return field; 
    } 

    public static void setField(String field) { 
     A.field = field; 
    } 
} 


public class B extends A{ 

} 


public class C extends A{ 

} 


public class Test { 

    public static void main(String[] args){ 
     B.setField("Thank you"); // or 
      new B().setField("Thank you"); 

     System.out.println(C.getField()); // or 
      System.out.println(new C().getField()); 

    // it will work for object and for class as well 
    } 
} 

出力:そのフィールドが静的である

1

あなたは、あなたのフィールドは静的作ってみることができます。そうすれば、この方法でアクセスすることができます。

+0

これは、そのクラスのすべてのインスタンスの値を設定します。これがJPAの永続性をどのように扱うのかを見ると、OPが望んでいることはまったくなく、大きな問題を引き起こします。 –

1

フィールドが静的である場合、それらが同じ値を共有します。 Hibernateを上回らないので、永続性の観点から何かが変更されるかどうかはわかりません。

3

かかわらず、それは、Javaの観点から可能であるかどうかの(それはあるが、ラウンドについての方法で)、それはあなたが必要とどのような処理するための正しい方法ではありません。一部の永続エンティティで外部キーを使用して値を更新している場合は、それを外部キーとして使用するエンティティで対応する値を更新する必要があります。 JPA/Hibernateでこれを処理してください。 Java EEチュートリアルのJava Persistence APIとHibernateのガイドを参照して、Hibernateの機能と、異なるエンティティクラスやテーブル間でのデータの共有/分割方法を理解することをお勧めします。

EDIT:誰もがOPがを望んでいるものを完全にされていない静的なフィールドについてのハンマー続けているので、私はこれを行うだろうかのサンプルを提供します...

public class Key { 
    private String value; 
    public Key(final String value) { 
     this.value = vale; 
    } 
    public String getValue() { 
     return value; 
    } 
    public void setValue(final String value) { 
     this.value = value; 
    } 
} 

public class A { 
    private final Key field; 
    public A(final Key field) { 
     this.field = field; 
    } 
    public setField(final String value) { 
     field.setValue(value); 
    } 
} 

public class B { 
    private final Key field; 
    public B(final Key field) { 
     this.field = field; 
    } 
    public setField(final String value) { 
     field.setValue(value); 
    } 
} 

//When using... 
Key k = new Key("value"); 
A a = new A(k); 
B b = new B(k); 

しかし、のような私は言った、これはJavaレベルの唯一の解決策ですが、永続性のコンテキストでは適切に動作しません。 JPAとHibernateに関するプライマリと外部のキーの使用法を読んでおく必要があります。元の質問で使用された表記法から判断すると、ポスターはJava以外のバックグラウンドから来ていると言えます。そのため、誤ってホイールを改造する前に、これらのテクノロジーを適切に使用する方法を学ぶことが重要です。

+0

はい、あなたは正しいです。静的なフィールドの答えは、私が求めているものです。私はこのように完全に逃しました。しかし、あなたは私の問題でそれを使うことはできません。私はdku.rajkumar ass assetetの答えをチェックします。なぜなら、それは最初の部分の質問に対する正解であるからです。しかし、あなたのよく書かれた答えをお寄せいただきありがとうございます。それは私に別の解決策を模索するよう促しました。 –

1

Hibernateは通常の静的フィールドを管理していないでしょう。あなたは、C.setField("foo")A.setField("foo")c.setField("foo")を呼び出す(静的メソッドのないオーバーライドがありません)サブクラスでそれらをシャドウしていない場合はその場合は、あなただけのクラスAに静的getterとsetterを追加することができますなど(cがインスタンスであることに注意してください) 。すべて同じメソッドへの呼び出しです。

エンティティに共通のプロパティを提供したいがエンティティの値が異なる場合は、@MappedSuperClassアノテーションを使用してみてください。

関連する問題