web-dev-qa-db-ja.com

Java(C#のように)で部分クラスを実行する方法はありますか?

C#には、クラスを複数の.csファイルに分散できるという優れた概念があります。これは、単一のオブジェクト(すべてのコードに必要なメンバー変数)が必要な場合にうまく機能しますが、コードが大量にあります。次に、このコードを機能ごとにソースファイル全体に分散させることができます。

Javaでこれを行う方法はありますか?

更新: Ok最初は、これは単一の大きなクラスでなければならない(DOCXファイルのコンテンツのレイアウトを実行する)と自分に言い聞かせました。しかし、これを投稿した後もっと考えてみたら、この1つの大きな(現在5,000行以上)クラスだと本当に気になりました。

そこで、いくつかの選択肢を検討し、それを1つのメインクラスと約20のヘルパークラスに分割するための良い方法を考え出しました。このように非常にうまく機能し、機能を各部分に実際に分離します。

ですから...部分クラスは時々便利な構成だと思いますが、この場合、部分クラスがないため、より良い設計を思いつくことができました。 (そして、これは最初の質問とは何の関係もありませんが、共有する価値があると思いました。)

18
David Thielen

いいえ。Javaは部分クラスをサポートしていません。詳細については、 この質問 および この質問 を参照してください。

16
Asaph

いいえ、Javaは部分クラスをサポートしていません。

これが単なる好奇心である場合は、 Scala をチェックしてください。 Javaと同じように.classファイルにコンパイルされ、完全な相互運用性があります。これは、「特性」として部分クラスの大まかな同等物をサポートします。

特性の使用例:

trait FunctionalityA {
  // some stuff implemented here
}

trait FunctionalityB {
  // more stuff implemented...
}

// etc...

class MyBigClass extends FunctionalityA with FunctionalityB with FunctionalityC
7
Dylan

Lombokの@Delegateに依存するC#部分クラスをエミュレートする方法を見つけました

@Getter 
@Setter
public class User {
    String name;
    @Delegate
    private UserDelegate delegate= new UserDelegate(this);
}
public class UserDelegate {
  private User expandOwner;

  public UserDelegate(User expandOwner) {
    this.expandOwner = expandOwner;
  }

  public void doSomethinga() {
    System.out.println(expandOwner.getName() + "did something!");
  }
}
// how to use:
User user= new User();
user.setName("Chrisme");
user.doSomethinga();

デリゲートクラスのexpandOwnerを介して、元のクラスのパブリックメソッドにアクセスできます。

0
chrvip

部分的なクラス定義をファイル全体に分散させる方法はありません。すべてのクラスは、独自の同名ファイルで定義する必要があります。

それどころか、そのファイル内および(最上位の)クラス定義内で追加のクラスを定義できます。

0
PNS