2016-05-30 7 views
2

Ich lerne gerade Java und habe gerade gelernt, was Konstrukteure sind. Ich verstehe nicht, warum Sie mehr als einen Konstruktor benötigen, wenn Sie alle Variablen initialisieren müssen.Warum sollten Sie mehr als einen Konstruktor verwenden?

+0

„brauchen mehr als einen Konstruktor, wenn Sie alle Variablen initialisieren müssen“, was Sie damit meinen? Die Variablen können in einem Konstruktor initialisiert werden. –

+0

@KarthikeyanVaithilingam Ich meinte, dass ich nicht verstehe, warum Sie mehr als einen Konstruktor verwenden müssen, weil Sie alle Variablen in einem Konstruktor initialisieren können und ich weiß nicht, was Sie sonst einen Konstruktor für die Initialisierung von Variablen verwenden würden. Entschuldigung für die Verwirrung. – Tren46

+2

Es ist in der Regel hauptsächlich für die Bequemlichkeit oder möglicherweise Effizienz in einigen Fällen. Sehen Sie sich einige der JDK-Klassen an, die mehrere Konstruktoren haben - [String] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) und [ArrayList] (https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html) haben Sie zum Beispiel einen Haufen - und es kann klarer werden. – yshavit

Antwort

1

Eine Klasse kann mehrere Konstruktoren haben, solange ihre Signatur (die Parameter, die sie annehmen) nicht identisch ist. Sie können so viele Konstruktoren definieren, wie Sie benötigen. Wenn eine Java-Klasse mehrere Konstruktoren enthält, sagen wir, dass der Konstruktor überladen ist (kommt in mehreren Versionen vor). Dies bedeutet, dass Konstruktorüberladung bedeutet, dass eine Java-Klasse mehrere Konstruktoren enthält.

Damit ist es vollständig abhängig von Ihrer Implementierung, ob Sie mehr als einen Konstruktor in Ihrer Klasse erstellen möchten oder nicht, aber mehrere Konstruktoren können Ihr Leben in vielen Fällen erleichtern. Angenommen, unter Klasse keinen Standardkonstruktor:

public class Employee { 

    private int age; 
    private String name; 

    Employee(int age, String name){ 
     this.age=age; 
     this.name=name;  
    } 
} 

So, während Objekt dieser Klasse Benutzer erstellen würde nicht in der Lage zu tun, bis er das Alter und Namen Parameter praktisch hat, die die wahre Funktionalität von Java-Objekten einschränkt Der Status der Objekte sollte jederzeit geändert und gefüllt werden können, sobald sie initialisiert sind.

0

pro Konstruktor hat einen bestimmten Zweck. Manchmal brauchen wir mehr als einen Konstruktor (Sonder in Entity Domäne Fall, wenn die Verwendung ORM)

Zum Beispiel:

  • leeren Konstruktor (keine Argumente) für die Reflexion,

  • Constructor hat Argument (s) zum Erstellen einer neuen Instanz (A a = new A('foo', 'bar');).

Diese Überlademethode (n).

Reality Beispiel:

package sagan.blog; 

import com.fasterxml.jackson.annotation.JsonIgnore; 
import org.hibernate.annotations.Type; 
import org.springframework.util.StringUtils; 
import sagan.team.MemberProfile; 

import javax.persistence.*; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; 

/** 
* JPA Entity representing an individual blog post. 
*/ 
@Entity 
@SuppressWarnings("serial") 
public class Post { 

    private static final SimpleDateFormat SLUG_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd"); 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @ManyToOne(cascade = CascadeType.PERSIST, optional = false) 
    private MemberProfile author; 

    @Column(nullable = false) 
    private String title; 

    @Column(nullable = false) 
    @Enumerated(EnumType.STRING) 
    private PostCategory category; 

    @Column(nullable = false) 
    @Enumerated(EnumType.STRING) 
    private PostFormat format; 

    @Column(nullable = false) 
    @Type(type = "text") 
    private String rawContent; 

    @Column(nullable = false) 
    @Type(type = "text") 
    private String renderedContent; 

    @Column(nullable = false) 
    @Type(type = "text") 
    private String renderedSummary; 

    @Column(nullable = false) 
    private Date createdAt = new Date(); 

    @Column(nullable = false) 
    private boolean draft = true; 

    @Column(nullable = false) 
    private boolean broadcast = false; 

    @Column(nullable = true) 
    private Date publishAt; 

    @Column(nullable = true) 
    private String publicSlug; 

    @ElementCollection 
    private Set<String> publicSlugAliases = new HashSet<>(); 

    @SuppressWarnings("unused") 
    private Post() { 
    } 

    public Post(String title, String content, PostCategory category, PostFormat format) { 
     this.title = title; 
     this.rawContent = content; 
     this.category = category; 
     this.format = format; 
    } 

    /* For testing only */ 
    public Post(Long id, String title, String content, PostCategory category, PostFormat format) { 
     this(title, content, category, format); 
     this.id = id; 
    } 

    public Long getId() { 
     return id; 
    } 

    public MemberProfile getAuthor() { 
     return author; 
    } 

    public void setAuthor(MemberProfile author) { 
     this.author = author; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public PostCategory getCategory() { 
     return category; 
    } 

    public void setCategory(PostCategory category) { 
     this.category = category; 
    } 

    public PostFormat getFormat() { 
     return format; 
    } 

    public void setFormat(PostFormat format) { 
     this.format = format; 
    } 

    public String getRawContent() { 
     return rawContent; 
    } 

    public void setRawContent(String rawContent) { 
     this.rawContent = rawContent; 
    } 

    public String getRenderedContent() { 
     return renderedContent; 
    } 

    public void setRenderedContent(String renderedContent) { 
     this.renderedContent = renderedContent; 
    } 

    public String getRenderedSummary() { 
     return renderedSummary; 
    } 

    public void setRenderedSummary(String renderedSummary) { 
     this.renderedSummary = renderedSummary; 
    } 

    public Date getCreatedAt() { 
     return createdAt; 
    } 

    public void setCreatedAt(Date createdAt) { 
     this.createdAt = createdAt; 
    } 

    public Date getPublishAt() { 
     return publishAt; 
    } 

    public void setPublishAt(Date publishAt) { 
     this.publishAt = publishAt; 
     publicSlug = publishAt == null ? null : generatePublicSlug(); 
    } 

    public boolean isDraft() { 
     return draft; 
    } 

    public void setDraft(boolean draft) { 
     this.draft = draft; 
    } 

    public void setBroadcast(boolean isBroadcast) { 
     broadcast = isBroadcast; 
    } 

    public boolean isBroadcast() { 
     return broadcast; 
    } 

    @JsonIgnore 
    public boolean isScheduled() { 
     return publishAt == null; 
    } 

    @JsonIgnore 
    public boolean isLiveOn(Date date) { 
     return !(isDraft() || publishAt.after(date)); 
    } 

    public String getPublicSlug() { 
     return publicSlug; 
    } 

    public void addPublicSlugAlias(String alias) { 
     if (alias != null) { 
      this.publicSlugAliases.add(alias); 
     } 
    } 

    @JsonIgnore 
    public String getAdminSlug() { 
     return String.format("%s-%s", getId(), getSlug()); 
    } 

    private String generatePublicSlug() { 
     return String.format("%s/%s", SLUG_DATE_FORMAT.format(getPublishAt()), getSlug()); 
    } 

    @JsonIgnore 
    private String getSlug() { 
     if (title == null) { 
      return ""; 
     } 

     String cleanedTitle = title.toLowerCase().replace("\n", " ").replaceAll("[^a-z\\d\\s]", " "); 
     return StringUtils.arrayToDelimitedString(StringUtils.tokenizeToStringArray(cleanedTitle, " "), "-"); 
    } 

    @Override 
    public String toString() { 
     return "Post{" + "id=" + id + ", title='" + title + '\'' + '}'; 
    } 
} 

Klasse Post selbst hat 3 Konstrukteurs genannt Post(){...}

Quelle: https://github.com/spring-io/sagan/blob/master/sagan-common/src/main/java/sagan/blog/Post.java

2

Um es einfach auszudrücken, Sie für die Bequemlichkeit mehrere Konstrukteure verwenden (1. Beispiel) oder um völlig andere Initialisierungsmethoden oder unterschiedliche Quellentypen zuzulassen (2. Beispiel.

Sie können mehrere Konstrukteure müssen Ihre Klasse zu implementieren, einfach zu erlauben einige der Parameter weggelassen, die bereits eingerichtet sind:

//The functionality of the class is not important, just keep in mind parameters influence it. 
class AirConditioner{ 
    enum ConditionerMode{ 
     Automatic, //Default 
     On, 
     Off 
    } 
    public ConditionerMode Mode; //will be on automatic by default. 
    public int MinTemperature = 18; 
    public int MaxTemperature = 20; 

    public AirConditioner(){ //Default constructor to use default settings or initialize manually. 
     //Nothing here or set Mode to Automatic. 
    } 

    //Mode 
    public AirConditioner(ConditionerMode mode){ //Setup mode, but leave the rest at default 
     Mode = mode; 
    } 
    //setup everything. 
    public AirConditioner(ConditionerMode mode, int MinTemp, int MaxTemp){ 
     Mode = mode; 
     MinTemperature = MinTemp; 
     MaxTemperature = MaxTemp; 
    } 
} 

Ein anderes Beispiel ist, wenn verschiedene Konstrukteure verschiedene Verfahren folgen die Variablen zu initialisieren. Zum Beispiel könnten Sie eine Datentabelle haben, die einfach eine Texttabelle anzeigt. Der Konstruktor kann die Daten entweder von Datenbank erhalten oder eine Datei:

class DataTable{ 
    public DataTable(){} //Again default one, in case you want to initialize manually 

    public DataTable(SQLConnection con, SQLCommand command){ 
     //Code to connect to database get the data and fill the table 
    } 

    public DataTable(File file){ 
     //Code to read data from a file and fill the table 
    } 
} 
0

So erinnert, dass der Zweck des Konstruktor zu initialisieren ist (ihr Werte geben). So denken Sie an diesem Modell:

public class Car{ 
      private String model; //Objects are null 
      private int year; // year = 0 
      Car(String model, int year){ 
      this.model = model; 
      this.year = year; 
     } 
    } 

Das Car-Objekt Sie Bedarf Werte für das Modell und das Jahr erstellen. Es wäre toll, wenn Sie einfach ein Dummy-Auto mit nur Standardwerten für jedes Feld erstellen könnten oder eine Zeichenfolge wie folgt verwenden:

"Ford 2016 or "Ford" and "2016" und erstellen Sie ein Auto-Objekt.

Erstellen Sie einfach zwei weitere Konstruktoren mit verschiedenen Signaturen, die diese Aufgabe erfüllen.

Stellen Sie sich auch vor, wir haben ein anderes String-Feld namens Besitzer. Der Besitzer eines Autos kann bei der Erstellung dieses Objekts nicht bekannt sein, aber Ihr Programm kann ohne es funktionieren. Wir können also den obigen Konstruktor verwenden und das Besitzerfeld des Car-Objekts wird auf null gesetzt.

Das ist der Zweck für mehrere Konstruktoren. Geben auf den Programmierer Flexibilität sagen was ein Objekt aus und erstellt werden, die Variablen müssen in erster Linie initialisiert werden.

Sie können auch dies nützlich finden:

enter image description here

Verwandte Themen