11

私は Java 5 アノテーションに少し慣れていないので、これらのいずれかが可能かどうか興味があります。

このアノテーションは、単純なゲッターとセッターを生成します。

@attribute
private String var = "";

注釈は、変数が null であってはならないことを示しているため、その@NotNullボイラープレート コードを毎回記述する必要はありません。

/*
 * @param s @NotNull
 */
public void setString(String s){
    ...
}

これらのいずれかが機能しますか? 可能であれば、それらは私が注釈を書く最初のもののようです。ドキュメントを読んでもこれらについてはあまりわからないので、実際には注釈の目的ではないと思います。ここでの方向性は高く評価されます。

4

7 に答える 7

15

注釈処理は、抽象構文ツリーで発生します。これは、パーサーが作成し、コンパイラーが操作する構造です。

現在の仕様 (リンク先) では、注釈プロセッサは抽象構文ツリーを変更できないと述べています。この結果の 1 つは、コード生成を行うのに適していないことです。

この種の機能が必要な場合は、XDocletをご覧ください。これにより、探しているコード生成の前処理が得られるはずです。

あなたの@NonNull例では、JSR-305は、ソフトウェアの欠陥検出を強化するための一連の注釈@NonNullであり、その他の多数の注釈が含まれて@CheckForNullいます。

編集: Project Lombokは、ゲッターとセッターの生成の問題を正確に解決します。

于 2008-12-08T10:31:38.727 に答える
14

ゲッター/セッター: はい、可能です。Project Lombok ( http://projectlombok.org/index.html ) は、getter/setter などを生成するための注釈を定義しています。

たとえば

@lombok.Data;
public class Person {
   private final String name;
   private int age;
}

生成されますgetName(変数は final であるため、setter はありません) およびgetAge/ setAge。また、必要なフィールドを初期化するequalshashCode、およびコンストラクターも生成します (この場合)。追加すると、両方のフィールドを初期化するコンストラクターが生成されます。の代わりに使用すると、オブジェクトが不変になります。toStringname@AllArgsConstructor@Value@Data

アクセス権 (getter を保護するか公開するか)、名前 (getName()またはname()?) などを制御するための注釈とパラメーターが他にもあります。たとえば、ビルダー拡張メソッドのアノテーションがとても気に入っています。

Lombok は非常に使いやすいです。

  • jar をダウンロードして注釈を使用するだけで、自動生成された getter/setter を実際にスペルアウトしなくてもコードで使用できます。
  • 注釈は実行時ではなくコンパイル時にのみ使用されるため、ロンボクをjarのものと一緒に配布しません。
  • ほとんどの IDE はこれをサポートしているため、コード補完、ナビゲーションなどで getter/setter が表示されます。Netbeans では、これはすぐに使用できます。IntelliJ IDEA では、Lombok プラグインを使用します。

NotNull: これは findbugs と IDEA IDE でサポートされています。

于 2010-02-02T18:06:01.947 に答える
4

あなたが参照している @attribute も、Java にあるため、注釈を扱うことができません (jamesh が指摘したように)。

おそらく探しているのは、Java にはまだ存在しない「プロパティ」です。しかし、これは現在非常にホットなトピックであり、Java 7 または Java 8 でそれらを取得する可能性があります (私はまだ 1.4.2 で立ち往生しているため、役に立たないかもしれませんが、役立つかもしれません)。

Java Posse エピソード #219で、アノテーションを使用してプロパティを実装するという興味深い議論がありました。

于 2008-12-08T10:48:13.890 に答える
4

アクセサーを置き換えるためにJavaで注釈を使用する方法はありますか?

つまり、Java 5/6 コンパイラはこれをサポートしておらず、サードパーティがコンパイラに依存しない方法でそのようなサポートを追加することは困難です。

注釈をより適切に処理するには、JUnitから始めます。バージョン 3 (事前アノテーション) および 4 (アノテーションベース) のコードを作成すると、フレームワークが命名パターンに基づくコントラクトをアノテーションベースのコントラクトにどのように置き換えたかをすぐに理解できます。

より劇的な例として、EJB 2 と EJB 3 を比較してください。

于 2008-12-08T01:21:03.457 に答える
2

OValという名前のプロジェクトがあり、私はそれがあなたが望むことをしていると思います。 http://oval.sourceforge.net/

事前の権利を覚えている場合はAspectJが必要ですが、AspectJがなくても簡単なチェック作業ができます。見てみな。

Hibernate Validatorもあります。チェックしてください:P

于 2008-12-08T12:42:49.713 に答える
2

それは可能ですが、宣言している場所ではありません。

http://code.google.com/p/javadude/wiki/Annotationsをご覧ください。

次のような注釈が付けられたクラスがあります

package sample;
import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind; 

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
})
public class Person extends PersonGen {}

そして、ゲッター/セッターなどを含む PersonGen クラスを生成します

プロセッサは、さらに多くのことを行います。現在のバージョンから API が少し壊れている新しいバージョンに取り組んでいることに注意してください。

于 2009-03-25T14:29:16.117 に答える
1

それらは便利な場合もありますが、属性が深刻に欠落している場合は、オブジェクト指向の設計全体が少し不安定になっている可能性があります。

OO Design の考え方は、メソッドは「アクション」であり、値を設定または取得するだけでなく、オブジェクトに何かを行うように要求するものであり、それはオブジェクトではなく、構造です。

属性の欠如が深刻な問題であると思われる場合は、セッターを使用したり、ゲッターに抵抗したりせずに、しばらくの間コーディングを試すことを強くお勧めします。

最初は難しいかもしれませんが、最終的には OO 設計の原則をよりしっかりと把握できるはずです。

(注: オブジェクトの構築後に「セッター」タイプの操作を行う必要があるまれな状況があります。最も一般的なのは、相互に参照する 2 つのオブジェクトを作成する必要がある場合です。この場合、ビルダー パターンのようなものをお勧めします。セッターは 1 回呼び出す必要があり、2 回呼び出されないように保護されています)

于 2010-02-02T18:29:54.553 に答える