Bir yap─▒c─▒y─▒ Java'da di─čerinden nas─▒l arayabilirim?


Al─▒nan cevaba git


Yap─▒c─▒y─▒ ba┼čka birinden ├ža─č─▒rmak m├╝mk├╝n m├╝ (ayn─▒ s─▒n─▒f i├žinde, bir alt s─▒n─▒ftan de─čil)? E─čer evet ise nas─▒l? Ve ba┼čka bir kurucu ├ža─č─▒rman─▒n en iyi yolu ne olabilir (e─čer bunu yapman─▒n birka├ž yolu varsa)?


2118









Cevap say─▒s─▒n─▒ say: 21






Evet m├╝mk├╝n:

 public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

    public Foo(int x) {
        this.x = x;
    }
}
 

Ayn─▒ s─▒n─▒ftaki bir yerine belirli bir ├╝st s─▒n─▒f yap─▒c─▒s─▒na zincir olu┼čturmak i├žin, super yerine kullan─▒n this . Not o yaln─▒zca bir kurucusuna zincir olabilir ve bu sizin yap─▒c─▒ g├Âvdesindeki birinci deyimi olmak zorundad─▒r .

Ayr─▒ca C # ile ilgili fakat ayn─▒ prensiplerin ge├žerli oldu─ču bu soruya bak─▒n─▒z .


2828







Kullanarak this(args) . Tercih edilen model en k├╝├ž├╝k kurucudan en b├╝y├╝─če ├žal─▒┼čmakt─▒r.

 public class Cons {

    public Cons() {
        // A no arguments constructor that sends default values to the largest
        this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);
    }

    public Cons(int arg1, int arg2) {
       // An example of a partial constructor that uses the passed in arguments
        // and sends a hidden default value to the largest
        this(arg1,arg2, madeUpArg3Value);
    }

    // Largest constructor that does the work
    public Cons(int arg1, int arg2, int arg3) {
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.arg3 = arg3;
    }
}
 

Ayr─▒ca valueOf'un ya da sadece "of" in daha yeni savunuculu bir yakla┼č─▒m─▒n─▒ kullanabilirsiniz:

 public class Cons {
    public static Cons newCons(int arg1,...) {
        // This function is commonly called valueOf, like Integer.valueOf(..)
        // More recently called "of", like EnumSet.of(..)
        Cons c = new Cons(...);
        c.setArg1(....);
        return c;
    }
} 
 

S├╝per bir s─▒n─▒f─▒ aramak i├žin kullan─▒n super(someValue) . Super ├ža─čr─▒s─▒ yap─▒c─▒daki ilk ├ža─čr─▒ olmal─▒d─▒r yoksa derleyici hatas─▒ al─▒rs─▒n─▒z.


233







[ Not: Sadece di─čer cevaplarda g├Ârmedi─čim bir y├Ân├╝ eklemek istiyorum: bunun () ilk sat─▒rda olmas─▒ gereklili─či s─▒n─▒rlamalar─▒n─▒n ├╝stesinden nas─▒l gelinir). ]

Java'da, ayn─▒ s─▒n─▒ftan ba┼čka bir yap─▒c─▒ arac─▒l─▒─č─▒yla bir kurucudan ├ža─čr─▒labilir this() . Ancak bunun this ilk sat─▒rda olmas─▒ gerekti─čini unutmay─▒n .

 public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, 0.0);
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }
}
 

Bu this b├╝y├╝k bir s─▒n─▒rlama gibi ilk sat─▒r g├Âr├╝n├╝yor ├╝zerinde g├Âsterilmesi gerekmektedir, ancak statik y├Ântemlerle di─čer kurucular arg├╝manlar olu┼čturabilirsiniz. ├ľrne─čin:

 public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, getDefaultArg3(argument1, argument2));
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }

  private static double getDefaultArg3(double argument1, double argument2) {
    double argument3 = 0;

    // Calculate argument3 here if you like.

    return argument3;

  }

}
 

195







Kodun i├žinden (ilk sat─▒rda de─čil) ba┼čka bir kurucu ├ža─č─▒rmam gerekti─činde, genellikle ┼č├Âyle bir yard─▒mc─▒ y├Ântem kullan─▒r─▒m:

 class MyClass {
   int field;


   MyClass() {
      init(0);
   } 
   MyClass(int value) {
      if (value<0) {
          init(0);
      } 
      else { 
          init(value);
      }
   }
   void init(int x) {
      field = x;
   }
}
 

Ancak ├žo─ču zaman, basit olanlardan ilk sat─▒rdaki daha karma┼č─▒k yap─▒c─▒lar─▒ m├╝mk├╝n oldu─ču kadar ├ža─č─▒rarak ba┼čka bir yoldan yapmaya ├žal─▒┼č─▒yorum. Yukar─▒daki ├Ârnek i├žin

 class MyClass {
   int field;

   MyClass(int value) {
      if (value<0)
         field = 0;
      else
         field = value;
   }
   MyClass() {
      this(0);
   }
}
 

38







Bir yap─▒c─▒ this i├žinde, ayn─▒ s─▒n─▒ftaki ba┼čka bir yap─▒c─▒y─▒ ├ža─č─▒rmak i├žin anahtar s├Âzc├╝─č├╝ kullanabilirsiniz . Bunu yapmak, a├ž─▒k bir kurucu ├ža─čr─▒s─▒ olarak adland─▒r─▒l─▒r .

─░┼čte Nesneler b├Âl├╝m├╝nden farkl─▒ bir uygulama ile ba┼čka bir Rectangle s─▒n─▒f─▒.

 public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(1, 1);
    }
    public Rectangle(int width, int height) {
        this( 0,0,width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}
 

Bu s─▒n─▒f bir dizi kurucu i├žerir. Her yap─▒c─▒, dikd├Ârtgenin ├╝ye de─či┼čkenlerinin bir k─▒sm─▒n─▒ veya tamam─▒n─▒ ba┼člat─▒r.


26







Zaten herkesin dedi─či gibi, a├ž─▒k bir yap─▒c─▒ ├ža─čr─▒s─▒ this(ÔÇŽ) olarak adland─▒r─▒lan siz kullan─▒yorsunuz .

Ancak, bu kadar a├ž─▒k bir kurucu ├ža─čr─▒ beyannamesi i├žerisinde at─▒fta bulunamayabilece─činizi unutmay─▒n.

  • herhangi bir ├Ârnek de─či┼čken veya
  • Herhangi bir ├Ârnek y├Ântemi veya
  • bir i├ž s─▒n─▒flar bu s─▒n─▒f veya ├╝st s─▒n─▒f ilan veya
  • this veya
  • super .

JLS'de belirtildi─či gibi (┬ž8.8.7.1).


15







Evet, bir kurucudan di─čerini ├ža─č─▒rmak m├╝mk├╝nd├╝r. Ama bunun bir kural─▒ var. Bir kurucudan di─čerine ├ža─čr─▒ yap─▒l─▒rsa, o zaman

Yeni yap─▒c─▒ ├ža─čr─▒s─▒n─▒n mevcut yap─▒c─▒daki ilk ifade olmas─▒ gerekti─čini

 public class Product {
     private int productId;
     private String productName;
     private double productPrice;
     private String category;

    public Product(int id, String name) {
        this(id,name,1.0);
    }

    public Product(int id, String name, double price) {
        this(id,name,price,"DEFAULT");
    }

    public Product(int id,String name,double price, String category){
        this.productId=id;
        this.productName=name;
        this.productPrice=price;
        this.category=category;
    }
}
 

Yani, a┼ča─č─▒daki gibi bir ┼čey ├žal─▒┼čmayacak.

 public Product(int id, String name, double price) {
    System.out.println("Calling constructor with price");
    this(id,name,price,"DEFAULT");
}
 

Ayr─▒ca, miras durumunda, alt s─▒n─▒f─▒n nesnesi olu┼čturuldu─čunda, ilk ├Ânce s├╝per s─▒n─▒f yap─▒c─▒s─▒ ad─▒ verilir.

 public class SuperClass {
    public SuperClass() {
       System.out.println("Inside super class constructor");
    }
}
public class SubClass extends SuperClass {
    public SubClass () {
       //Even if we do not add, Java adds the call to super class's constructor like 
       // super();
       System.out.println("Inside sub class constructor");
    }
}
 

B├Âylece, bu durumda, ba┼čka bir kurucu ├ža─čr─▒s─▒ ilk ├Ânce di─čer ifadelerden ├Ânce bildirilir.


11







Sana kolay bir yol anlataca─č─▒m

Orada iki in┼čaat├ž─▒ t├╝rleri:

  1. Varsay─▒lan yap─▒c─▒
  2. Parametreli yap─▒c─▒

Bir ├Ârnekte a├ž─▒klayaca─č─▒m

 class ConstructorDemo 
{
      ConstructorDemo()//Default Constructor
      {
         System.out.println("D.constructor ");
      }

      ConstructorDemo(int k)//Parameterized constructor
      {
         this();//-------------(1)
         System.out.println("P.Constructor ="+k);       
      }

      public static void main(String[] args) 
      {
         //this(); error because "must be first statement in constructor
         new ConstructorDemo();//-------(2)
         ConstructorDemo g=new ConstructorDemo(3);---(3)    
       }
   }                  
 

Yukar─▒daki ├Ârnekte 3 tip ├ža─čr─▒ g├Âsterdim

  1. this () bu ├ža─čr─▒, yap─▒c─▒daki ilk ifade olmal─▒d─▒r
  2. Bu isim az nesne. bu otomatik olarak varsay─▒lan kurucuyu ├ža─č─▒r─▒r. 3.Bu Parametreli yap─▒c─▒y─▒ ├ža─č─▒r─▒r.

Not: Bu, yap─▒c─▒daki ilk ifade olmal─▒d─▒r.


9







Evet, herhangi bir say─▒da kurucu bir s─▒n─▒fta bulunabilir ve this() [L├╝tfen this() yap─▒c─▒ ├ža─čr─▒s─▒n─▒ this anahtar kelimeyle kar─▒┼čt─▒rmay─▒n ] kullan─▒larak ba┼čka bir kurucu taraf─▒ndan ├ža─čr─▒labilir . this() veya this(args) yap─▒c─▒daki ilk sat─▒r olmal─▒d─▒r.

├ľrnek:

 Class Test {
    Test() {
        this(10); // calls the constructor with integer args, Test(int a)
    }
    Test(int a) {
        this(10.5); // call the constructor with double arg, Test(double a)
    }
    Test(double a) {
        System.out.println("I am a double arg constructor");
    }
}
 

Bu, yap─▒c─▒ a┼č─▒r─▒ y├╝klemesi olarak bilinir.
Yap─▒c─▒ i├žin, yaln─▒zca a┼č─▒r─▒ y├╝klenme kavram─▒n─▒n uygulanabilir oldu─čunu ve miras veya ge├žersiz k─▒lma olmad─▒─č─▒n─▒ l├╝tfen unutmay─▒n.


9


2016-11-16





"This" anahtar s├Âzc├╝─č├╝n├╝ kullanarak ayn─▒ s─▒n─▒f─▒n ba┼čka bir yap─▒c─▒s─▒ndan bir yap─▒c─▒ olabilirsiniz. ├ľrnek -

 class This1
{
    This1()
    {
        this("Hello");
        System.out.println("Default constructor..");
    }
    This1(int a)
    {
        this();
        System.out.println("int as arg constructor.."); 
    }
    This1(String s)
    {
        System.out.println("string as arg constructor..");  
    }

    public static void main(String args[])
    {
        new This1(100);
    }
}
 

Çıktı - arg yapıcısı olarak dize .. Varsayılan yapıcı .. int yapıcısı olarak ..


7







Yap─▒c─▒y─▒ ba┼čka bir kurucudan ├ža─č─▒rmak

 class MyConstructorDemo extends ConstructorDemo
{
    MyConstructorDemo()
    {
        this("calling another constructor");
    }
    MyConstructorDemo(String arg)
    {
        System.out.print("This is passed String by another constructor :"+arg);
    }
}
 

Ayr─▒ca ├ža─čr─▒ kullanarak ebeveyn kurucuyu super() arayabilirsiniz.


7







Olduk├ža basit

 public class SomeClass{

    private int number;
    private String someString;

    public SomeClass(){
        number = 0;
        someString = new String();
    }

    public SomeClass(int number){
        this(); //set the class to 0
        this.setNumber(number); 
    }

    public SomeClass(int number, String someString){
        this(number); //call public SomeClass( int number )
        this.setString(someString);
    }

    public void setNumber(int number){
        this.number = number;
    }
    public void setString(String someString){
        this.someString = someString;
    }
    //.... add some accessors
}
 

┼čimdi burada baz─▒ k├╝├ž├╝k ekstra kredi:

 public SomeOtherClass extends SomeClass {
    public SomeOtherClass(int number, String someString){
         super(number, someString); //calls public SomeClass(int number, String someString)
    }
    //.... Some other code.
}
 

Bu yard─▒mc─▒ olur umar─▒m.


7







Evet, bir kurucudan di─čerini aramakla ├ža─č─▒rmak m├╝mk├╝nd├╝r. this()

 class Example{
   private int a = 1;
   Example(){
        this(5); //here another constructor called based on constructor argument
        System.out.println("number a is "+a);   
   }
   Example(int b){
        System.out.println("number b is "+b);
   }
 

6







Anahtar kelime bu bir yap─▒c─▒ bir kurucusunu ├ža─č─▒rmak i├žin kullan─▒labilir, bir s─▒n─▒f i├žin ├že┼čitli yap─▒c─▒ yazarken, yinelenen kod ├Ânlemek i├žin di─čerinden bir yap─▒c─▒s─▒ aramak istiyorum zamanlar vard─▒r.

K├Âr├╝k, yap─▒c─▒ ve al─▒c─▒lar () ve ayarlay─▒c─▒lar () hakk─▒nda di─čer konular─▒ a├ž─▒klad─▒─č─▒m ve iki kurucu olan bir s─▒n─▒f kulland─▒─č─▒m bir ba─člant─▒. Umar─▒m a├ž─▒klamalar ve ├Ârnekler size yard─▒mc─▒ olur.

Setter y├Ântemleri veya yap─▒c─▒lar


5







Karma┼č─▒k konstr├╝ksiyona olan ihtiyac─▒ kapsayan tasar─▒m desenleri vard─▒r - e─čer ba┼čar─▒yla yap─▒lamazsa, bir fabrika y├Ântemi veya fabrika s─▒n─▒f─▒ olu┼čturun.

En yeni java ve lambdalar─▒n eklenmesiyle, istedi─činiz herhangi bir ba┼člatma kodunu kabul edebilecek bir yap─▒c─▒ olu┼čturmak kolayd─▒r.

 class LambdaInitedClass {

   public LamdaInitedClass(Consumer<LambdaInitedClass> init) {
       init.accept(this);
   }
}
 

... ile ara

  new LambdaInitedClass(l -> { // init l any way you want });
 

5







Bu sorunun pek ├žok ├Ârne─či oldu─čunu biliyorum ama ne buldu─čumu, fikrimi payla┼čmak i├žin buraya koyuyorum. yap─▒c─▒ zincirlemenin iki yolu vard─▒r. Ayn─▒ s─▒n─▒fta bu anahtar kelimeyi kullanabilirsiniz. Kal─▒t─▒m'da, s├╝per anahtar kelime kullanman─▒z gerekir.

     import java.util.*;
    import java.lang.*;

    class Test
    {  
        public static void main(String args[])
        {
            Dog d = new Dog(); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.
            Dog cs = new Dog("Bite"); // Both Calling Same Constructor of Parent Class i.e. 0 args Constructor.

            // You need to Explicitly tell the java compiler to use Argument constructor so you need to use "super" key word
            System.out.println("------------------------------");
            Cat c = new Cat();
            Cat caty = new Cat("10");

            System.out.println("------------------------------");
            // Self s = new Self();
            Self ss = new Self("self");
        }
    }

    class Animal
    {
        String i;

        public Animal()
        {
            i = "10";
            System.out.println("Animal Constructor :" +i);
        }
        public Animal(String h)
        {
            i = "20";
            System.out.println("Animal Constructor Habit :"+ i);
        }
    }

    class Dog extends Animal
    {
        public Dog()
        {
            System.out.println("Dog Constructor");
        }
        public Dog(String h)
        {
            System.out.println("Dog Constructor with habit");
        }
    }

    class Cat extends Animal
    {
        public Cat()
        {
            System.out.println("Cat Constructor");
        }
        public Cat(String i)
        {
            super(i); // Calling Super Class Paremetrize Constructor.
            System.out.println("Cat Constructor with habit");
        }
    }

    class Self
    {
        public Self()
        {
            System.out.println("Self Constructor");
        }
        public Self(String h)
        {
            this(); // Explicitly calling 0 args constructor. 
            System.out.println("Slef Constructor with value");
        }
    }
 

4







Teleskop Yap─▒c─▒ anti-patern veya yap─▒c─▒ zincirleme olarak adland─▒r─▒l─▒r. Evet, kesinlikle yapabilirsin. Yukar─▒da bir├žok ├Ârnek g├Âr├╝yorum ve sadece iki veya ├╝├ž kurucuya ihtiyac─▒n─▒z oldu─čunu biliyorsan─▒z, tamam olabilece─čini s├Âyleyerek eklemek istiyorum. Fakat daha fazlas─▒na ihtiyac─▒n─▒z varsa, l├╝tfen Olu┼čturucu deseni gibi farkl─▒ tasar─▒m deseni kullanmaya ├žal─▒┼č─▒n. Ornek olarak:

  public Omar(){};
 public Omar(a){};
 public Omar(a,b){};
 public Omar(a,b,c){};
 public Omar(a,b,c,d){};
 ...
 

Daha fazlas─▒na ihtiyac─▒n─▒z olabilir. Olu┼čturucu deseni bu durumda harika bir ├ž├Âz├╝m olacakt─▒r. ─░┼čte bir makale, yararl─▒ olabilir https://medium.com/@modestofiguereo/design-patterns-2-the-builder-pattern-and-the-telescoping-constructor-anti-pattern-60a33de7522e


4







this(...) Anahtar kelime (ayn─▒ s─▒n─▒ftan bir kurucu ├ža─č─▒rman─▒z gerekti─činde) veya super(...) anahtar kelime (bir ├╝st s─▒n─▒ftan kurucu ├ža─č─▒rman─▒z gerekti─činde) arac─▒l─▒─č─▒yla ba┼čka bir kurucu arayabilirsiniz.

Ancak, b├Âyle bir ├ža─čr─▒, kurucunuzun ilk ifadesi olmal─▒d─▒r . To ├╝stesinden Bu s─▒n─▒rlamay─▒ kullanmak bu cevab─▒ .


4







Ba┼člang─▒├žta Mirko Klemm taraf─▒ndan yap─▒lan bir cevaptan, soruyu yan─▒tlamak i├žin biraz de─či┼čtirildi:

Sadece taml─▒k i├žin: Her zaman ve ba┼čka bir kurucu ├ža─čr─▒lmadan ├Ânce ├žal─▒┼čt─▒r─▒lan ├ľrnek ba┼člatma blo─ču da vard─▒r . Basit├že, s─▒n─▒f tan─▒m─▒n─▒z─▒n g├Âvdesinde bir yerde "{...}" ifadeleri blo─čundan ibarettir. Birden fazla bile olabilir. Bunlar─▒ arayamazs─▒n─▒z, ancak baz─▒ kodlar─▒ yeniden olu┼čturma y├Ântemlerine benzer ┼čekilde yeniden kullanmak istiyorsan─▒z, "payla┼č─▒lan kurucu" kodu gibiler.

Yani senin durumunda

 { 
  System.out.println("this is shared constructor code executed before the constructor");
  field1 = 3;
}
 

Ayr─▒ca statik ├╝yeleri ba┼člatmak i├žin "statik" bir s├╝r├╝m├╝ de var: "static {...}"


1







Bu ┼čekilde tercih ederim:

     class User {
        private long id;
        private String username;
        private int imageRes;

    public User() {
        init(defaultID,defaultUsername,defaultRes);
    }
    public User(String username) {
        init(defaultID,username, defaultRes());
    }

    public User(String username, int imageRes) {
        init(defaultID,username, imageRes);
    }

    public User(long id, String username, int imageRes) {
        init(id,username, imageRes);

    }

    private void init(long id, String username, int imageRes) {
        this.id=id;
        this.username = username;
        this.imageRes = imageRes;
    }
}
 

1







Evet, yap─▒c─▒lar─▒ ba┼čka bir yap─▒c─▒dan arayabilirsiniz. ├ľrne─čin:

 public class Animal {
    private int animalType;

    public Animal() {
        this(1);
    }

    public Animal(String animalType) {
        this.animalType = animalType;
    }
}
 

Java'daki Yap─▒c─▒ Zincirleme b├Âl├╝m├╝nden de ayr─▒nt─▒l─▒ olarak okuyabilirsiniz. https://beginnersbook.com/2013/12/java-constructor-chaining-with-example/


0



─░lgili yay─▒nlar


Bir kurucudan di─čerini ├ža─č─▒r─▒n

Yap─▒c─▒y─▒ C++ 'ta ba┼čka bir yap─▒c─▒dan (yap─▒c─▒ zincirleme yap─▒yor) arayabilir miyim?

Ba┼čka bir kabuk beti─činden kabuk beti─či nas─▒l ├ža─č─▒r─▒l─▒r?

Linux'ta bir dosyay─▒ kabuktan di─čerine nas─▒l ekleyebilirim?

Geri aramalar─▒ d├╝z ingilizce olarak nas─▒l a├ž─▒klayabilirim? Bir i┼člevi di─čer bir i┼člevden ├ža─č─▒rmaktan ne kadar farkl─▒d─▒rlar?

Dosyalar─▒ Java'da bir dizinden di─čerine kopyalama

Java'da bir dosyay─▒ bir konumdan di─čerine nas─▒l ta┼č─▒r─▒m?

Bir Array'─▒ Ruby'den di─čerine ├ž─▒karma

Statik y├Ântemler - Ba┼čka bir y├Ântemden bir y├Ântem nas─▒l ├ža─č─▒r─▒l─▒r?

Perl beti─čime ba┼čka bir dosyadaki i┼člevleri nas─▒l eklerim?

Etiketle ilgili di─čer sorular [java]


Varchar ve nvarchar aras─▒ndaki fark nedir?

dispatch_after - Swift'de GCD?

SQL Server'da .NET'te Math.Max ÔÇőÔÇőgibi iki de─čer alan bir Max i┼člevi var m─▒?

Diziyi JSON'a d├Ân├╝┼čt├╝r

jquery s─▒n─▒f ad─▒n─▒ de─či┼čtir

Komut sat─▒r─▒ CSV g├Âr├╝nt├╝leyici? [kapal─▒]

Microsoft SQL Server'a Giri┼č Hatas─▒: 18456

Nesne uzunlu─ču nas─▒l al─▒n─▒r [├žo─čalt─▒l─▒r]

Bir web sayfas─▒na ├Âzel bir sa─č t─▒klama men├╝s├╝ nas─▒l eklenir?

Java'da ba┼čka bir diziden alt diziler nas─▒l olu┼čturulur?