Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで可変オブジェクト参照を使用して不変クラスを作成するにはどうすればよいですか?


不変オブジェクト 初期化されると状態を変更できないオブジェクトです。 。要件に応じて不変のクラスを作成する必要がある場合があります。たとえば、すべてのプリミティブラッパークラス (Integer、Byte、Long、Float、Double、Character、Boolean、Short)はJavaでは不変です。 文字列クラス 不変のクラスでもあります。

カスタムの不変クラスを作成するには、次の手順を実行する必要があります

  • クラスを最終として宣言します 延長することはできません。
  • すべてのフィールドを非公開にする 直接アクセスが許可されないようにします。
  • より適切な方法を提供しないでください (フィールドを変更するメソッド)変数の場合、設定できません。
  • すべての可変フィールドをファイナルにする 値を1回だけ割り当てることができるようにします。
  • コンストラクターを使用してすべてのフィールドを初期化します ディープコピーを実行します。
  • オブジェクトのクローン作成を実行します getterメソッドで、実際のオブジェクト参照を返すのではなく、コピーを返します。
  • インスタンスフィールドに可変オブジェクトへの参照が含まれている場合 、これらのオブジェクトの変更を許可しないでください
  • 可変を変更するメソッドを提供しないでください オブジェクト
  • 参照を共有しないでください 可変オブジェクトへ 。コンストラクターに渡された外部の可変オブジェクトへの参照は絶対に保存しないでください。必要に応じて、コピーを作成し、コピーへの参照を保存します。同様に、メソッドで元のオブジェクトが返されないようにするために、必要に応じて内部の可変オブジェクトのコピーを作成します。

// Employee.java
final class Employee {
   private final String empName;
   private final int age;
   private final Address address;
   public Employee(String name, int age, Address address) {
      super();
      this.empName = name;
      this.age = age;
      this.address = address;
   }
   public String getEmpName() {
      return empName;
   }
   public int getAge() {
      return age;
   }
   /* public Address getAddress() {
      return address;
      }
   */
   public Address getAddress() throws CloneNotSupportedException {
      return (Address) address.clone();
   }
}
// Address.java
class Address implements Cloneable {
   public String addressType;
   public String address;
   public String city;
   public Address(String addressType, String address, String city) {
      super();
      this.addressType = addressType;
      this.address = address;
      this.city = city;
   }
   public String getAddressType() {
      return addressType;
   }
   public void setAddressType(String addressType) {
      this.addressType = addressType;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String address) {
      this.address = address;
   }
   public String getCity() {
      return city;
   }
   public void setCity(String city) {
      this.city = city;
   }
   public Object clone() throws CloneNotSupportedException {
      return super.clone();
   }

   @Override
   public String toString() {
      return "Address Type - "+addressType+", address - "+address+", city - "+city;
   }
}
// MainClass.java
public class MainClass {
   public static void main(String[] args) throws Exception {
      Employee emp = new Employee("Adithya", 34, new Address("Home", "Madhapur", "Hyderabad"));
      Address address = emp.getAddress();
      System.out.println(address);
      address.setAddress("Hi-tech City");
      address.setAddressType("Office");
      address.setCity("Hyderabad");
      System.out.println(emp.getAddress());
   }
}

上記の例では、元のアドレスを返す代わりに ディープクローンコピーを返すオブジェクト そのインスタンスの。アドレスクラスは、クローン可能を実装する必要があります インターフェイス。

出力
Address Type - Home, address - Madhapur, city - Hyderabad
Address Type - Home, address - Madhapur, city - Hyderabad

  1. Javaで匿名クラスを使用してスレッドを作成するにはどうすればよいですか?

    スレッド プログラムの他の部分と同時に実行できる機能です。すべてのJavaプログラムには、 Java仮想マシン(JVM)によって作成されるメインスレッドと呼ばれるスレッドが少なくとも1つあります。 main()がプログラム開始時に メソッドはメインスレッドで呼び出されます。 Javaでは、スレッドを拡張することでスレッドを作成できます。 クラス またはRunnableインターフェースを実装する 。 匿名を使用してスレッドを作成することもできます クラススレッドクラスを拡張せずに 以下のプログラムで。 例 public class AnonymousThreadTest {   &

  2. Javaで抽象クラスのオブジェクトを作成できますか?

    いいえ、抽象クラスのオブジェクトを作成することはできません。ただし、抽象クラスの参照変数を作成することはできます。参照変数は、派生クラス(抽象クラ​​スのサブクラス)のオブジェクトを参照するために使用されます。 抽象クラスとは、実装を非表示にし、関数定義をユーザーに表示することを意味し、抽象クラスと呼ばれます。 Java抽象クラスには、要件がわかっていて、抽象クラスに部分的に実装できる場合に、デフォルトの動作を実装するインスタンスメソッドを含めることができます。 例 abstract class Diagram {    double dim1;