Java >> Java tutorial >  >> Tag >> static

Java 8 standard og statisk metode i grænseflade

Java 8 har introduceret standardmetode såvel som statisk metode, der kan defineres i grænsefladen. Standardmetoden er en normal java-metode, men starter med standard nøgleord og statisk metode erklæres som sædvanligt med statisk nøgleord.

Hvorfor standardmetode i Java-grænseflade?

Et spørgsmål kommer i tankerne, hvorfor java har introduceret standardmetoder i grænsefladen. Antag, at en traktorfabrikant har offentliggjort standardgrænsefladen til at betjene traktoren, såsom hvordan man tager gear eller pause osv. Udvikleren har udviklet forskellige typer traktorer, der implementerer standardtraktorgrænsefladen. Hvad hvis virksomheden tilføjer en ny funktionalitet i sin standardgrænseflade, såsom hvordan man hopper over traktoren? Udvikler skal lave ændringer i deres klasse for at definere nye metoder, hvilket ikke er en god tilgang. Nu har vi brug for her standardmetode til at håndtere denne situation for at undgå omskrivning af alle klasser, der implementerer standard traktorgrænseflade. Definer standardmetoden i grænsefladen, og den vil være tilgængelig i alle klasser, der implementerer traktorgrænseflade.

Hvorfor statisk metode i Java-grænsefladen?

Ud fra Java 8 kan en grænseflade have statiske metoder. En statisk metode er forbundet med en klasse, ikke med objektet. Statisk metode fungerer som hjælpermetode. Så hvis vi erklærer statiske metoder i grænsefladen, er det nemt for os at organisere vores hjælpemetoder.



Scenario 1:Standardmetode i grænsefladen

For at forstå brugen af ​​standardmetoden opretter jeg en grænseflade Village, der har nogle metodeerklæringer og en standardmetode. Standardmetoden starter med standardsøgeord. Som standard vil alle grænseflademetoder være offentlige, så det er ikke nødvendigt at bruge offentlige søgeord til at erklære og definere metoder i grænsefladen.
Village.java
package com.concretepage;
public interface Village {
    void setNumOfPeople(int num);
    void setName(String name);
    default String getBusinessType(){
        return "Most of the Village people do Farming";
    }
}
Opret en placeringsklasse, der implementerer landsbygrænsefladen. Standardmetoden vil automatisk være tilgængelig i denne klasse.
Location.java
package com.concretepage;
public class Location implements Village {
    public int noOfPeople;
    public String name;
    @Override
    public void setNumOfPeople(int n){
        this.noOfPeople = n;
    }
    @Override
    public void setName(String name){
        this.name = name;
    }
}
For at teste scenariet skal du oprette en hovedklasse og få adgang til standardmetoden efter placeringsobjekt.
Main.java
package com.concretepage;
public class Main {
    public static void main(String[] args){
        Location lo = new Location();
        System.out.println(lo.getBusinessType());
    }    
}
Output vil være som nedenfor.
Most of the Village people do Farming



Scenario to:Statisk metode i grænsefladen

Nu kan vi også skrive statisk metode i grænsefladen. I vores landsbygrænseflade har jeg erklæret getVillageId() som en statisk metode. Denne statiske metode kan også tilgås i standardmetoden.
Village.java
package com.concretepage;
public interface Village {
    void setNumOfPeople(int num);
    void setName(String name);
    static int getVillageId(){
        return 1;
    }
    default String getBusinessType(){
        return "Business type is Farming  and village id:"+getVillageId();
    }
}
Jeg laver nogle ændringer i Location-klassen for at bruge statisk metode. Vi kan bruge statisk metode efter grænsefladenavn.
Location.java
package com.concretepage;
public class Location implements Village {
    public int noOfPeople;
    public String name;
    @Override
    public void setNumOfPeople(int n){
        this.noOfPeople = n;
    }
    @Override
    public void setName(String name){
        this.name = name;
    }
    public int getLocationId(){
        return Village.getVillageId();
    }
}
Find hovedmetoden til at teste den statiske metode.
Main.java
package com.concretepage;
public class Main {
    public static void main(String[] args){
        Location lo = new Location();
        System.out.println(lo.getBusinessType());
        System.out.println("Village id:"+Village.getVillageId());
        System.out.println("Location Id:"+lo.getLocationId());
    }    
}
Kør Main-klassen og kontroller outputtet.
Business type is Farming  and village id:1
Village id:1
Location Id:1

Scenarie tre:Multipel arv – standardmetode med samme navn i to grænseflader

I flere scenarier med arv, hvor en klasse implementerer mere end én grænseflade, skal vi kontrollere, hvordan standardmetoden opfører sig. Nu laver jeg endnu en grænseflade, der indeholder getBusinessType() som standardmetode.
City.java
package com.concretepage;
public interface City {
    void setName(String name);
    void setArea(int area);
    default String getBusinessType(){
        return "Service";
    }
}
For flere arv vil Location class implementere landsby- og bygrænseflader begge. Da Village og City begge indeholder standardmetode med samme navn, så på grund af tvetydighed, vil Location-klassen tvinge til at definere denne standardmetode eksplicit i klassen. Placeringsklassen vil ikke kompilere, før vi definerer en metode med samme navn som standardmetoden.
Location.java
package com.concretepage;
public class Location implements Village, City {
    public int noOfPeople;
    public String name;
     public int area;
    @Override
    public void setNumOfPeople(int n){
        this.noOfPeople = n;
    }
    @Override
    public void setName(String name){
        this.name = name;
    }
    @Override
    public void setArea(int area){
        this.area = area; 
    }
    @Override
    public String getBusinessType(){
        return "People do business like Farming and Service.";
    }
    public int getLocationId(){
        return Village.getVillageId();
    }
}
Kør Main-klassen, og outputtet vil være som nedenfor.
People do business like Farming and Service.
Village id:1
Location Id:1

Java tag