2017-01-19 4 views
2

私はあるアプリケーションから別のアプリケーションにデータを転送し、変更が加えられた場合に更新するために使用されるクラスを持っています。フィールドが保存されないことを通知する方法

public class Data { 
    private String name; 
    private String number; 
    private String info; 

    ... getters/setters... 
} 

例えばあなたがそれらを変更した場合のはnamenumberが更新されますが、言ってみましょう情報はありません。プログラマーにこれを直ちに認識させるために、これが意図されていることをプログラマーに伝える最良の方法は何ですか?

更新: これはJSONファイルとしてエンコードされています。私はそれを元に戻すと、もう情報フィールドは気にしません。それは空でもかまいません

+1

私があなたが探している言葉は_persistence_だと思っています。 'name'と' number'は永続的です、 'info'はそうではありません。 –

+0

フィールドの隣にコメントを書く以外はどのようなオプションがありますか? – user489872

+0

Hibernateを使用している場合、@Transientアノテーションは –

答えて

2

アプリケーションに固有のカスタム注釈を作成することができます。 Hibernateのようなフレームワークを使用しているなら、@ transientを使うことができます。

+2

しかし、OPはDBやHibernateについて一度も話したことがありません – BackSlash

+0

他のプログラマーにも通知するには、アノテーションがオーバーライド、機能インタフェースのように役立つことがあります。私はちょうどdbの例を与えました:) @BackSlash –

+1

OPはカスタム注釈に言及しました。さもなければ、コメント '// transient'だけが役に立ちます - ほとんどの人がそれを理解し、Hibernateとの比較は使用されていなくても有効です。 – vikingsteve

0

ここにスタートhttps://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html

ほとんどこのようなPOJOをseing任意のプログラマはその行動を知っているだろうが、あなたが説明したものです....

@Table(name = "data") 
public class Data { 
    @Id 
    @Column(name = "name") 
    private String name; 

    @Column(name = "number") 
    private String number; 

    private String info; 

    ... getters/setters... 
} 

UPDATE:それは次のようにエンコードされていますJSONファイルと私はそれを戻すとき私はもう情報フィールドについて気にしません。それはおそらく正しい方法

0

空でないかもしれないが、あなただけの他のプログラマを「通知」について話している場合、あなたは単にあなたのinfoフィールドに過渡キーワードを入れることができます。

もちろん、それは本当に "非公式"でしょう。 フレームワークがあなたのフィールドをどのように処理しているかにはまったく影響しません。

+0

しかし、彼は言ったので、プログラマはドキュメントを読むべきです。将来プログラマにこれを認識させるための最良の方法です。 – AxelH

0

私はnamenumberが永続化されていることを、あなたのファイルには表示がありませんtransientキーワード

What is object serialization?

import java.io.*; 
import java.util.*; 

// This class implements "Serializable" to let the system know 
// it's ok to do it. You as programmer are aware of that. 
public class SerializationSample implements Serializable { 

    // These attributes conform the "value" of the object. 

    // These two will be serialized; 
    private String aString = "The value of that string"; 
    private int someInteger = 0; 

    // But this won't since it is marked as transient. 
    private transient List<File> unInterestingLongLongList; 
0

と組み合わせた直列化を使用します。

ファイルにビヘイビアを入れようとする場合、これは単なるファイルではなく、データと関連するビヘイビアが存在するオブジェクトの表現です。意図を明確にする方法を書く。

public boolean isStorable() { 
    boolean isOk = true; 
    isOk &= (name != null && name.length() > 0); 
    isOk &= (number > 0); 
    return isOk; 
} 

はそれを明確にこれらの項目の一つ一つが、オブジェクトを格納することができることに貢献し、これらの項目内のすべての値が有効な記憶状態に寄与しないことではないことをします。

このオブジェクトがプライベートデータ内で無効な状態を許可することも明らかになります。それは設計の欠陥を示す可能性のあるコードの匂いです。おそらく、それが設計上の欠陥であるかどうかを調べ、そうであればそれを修正する必要があります。

+0

do-nothingゲッターとセッターの束を持つフィールドの束は、何の振る舞いもしていないため、Javaの真のObject Oriented Programmingオブジェクトではありません。これはCスタイルのデータ構造です。 Javaを使用するのに便利なこともあり、実装する正しい方法を記述していますが、そのようなことを実装する場合は、プログラムのこの部分でOOPのメリットを失うことに注意してください。 –

+0

また、非常に有用なフレームワーク、技術、ツールの多くは理想的にはOOPを採用していないことにも注意してください。特定の永続性テクノロジを念頭に置いて保管している場合は、そのテクノロジの規約を遵守してください。たとえば、JPAで永続化する場合は、どのフィールドが永続化されているかを示す注釈をどのデータベース表および列に入れるかを指定します。あなたのマークアップを理解できるようになるのは、フレームワークがその意味を教えてくれるからです。 –

関連する問題