Keycloak, açık kaynaklı bir kimlik ve erişim yönetimi çözümüdür. Daha fazla bilgi için keycloak web sitesini ziyaret edebilirsiniz.
Terminali açın ve aşağıdaki komutu çalıştırın.
docker run -p 8085:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:15.0.2
1- Keycloak admin paneline http://localhost:8085/ adresinden erişiniz. Administration console tıklayarak admin olarak giriş yapınız.
2- demo isminde yeni bir realm oluşturun.
3- Şimdiyse demo-app isminde yeni bir client oluşturacağız. Access type olarak public, Valid Redirect URI olarakta * veriniz. Ve ayarları kaydediniz.
4- Kullanıcı oluşturalım.
Keycloak ayarlarımızı tamamladık. Şimdiyse Spring Boot projesi kısmına geçelim.
1- IntelliJ IDEA üzerinden New Project diyerek açılan pencereden Spring Initializr tabını seçelim ve projemizi SpringBootKeycloak şeklinde isimlendirelim.
2- Spring Web ve Spring Security bağımlılıklarını projemize dahil edelim.
3- Pom.xml’e aşağıdaki kodları ekleyelim.
<dependencies> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> <version>15.0.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>15.0.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Pom.xml’in son hali aşağıdaki gibi olmalıdır:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>SpringBootKeycloak</artifactId> <version>0.0.1-SNAPSHOT</version> <name>SpringBootKeycloak</name> <description>SpringBootKeycloak</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> <version>15.0.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>15.0.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
5- Son olarak application.properties dosyasına aşağıdaki parametreleri ekleyelim.
keycloak.auth-server-url=http://localhost:8085/auth keycloak.realm=demo keycloak.resource=demo-app keycloak.public-client=true
keycloak.auth-server-url -> Keycloak url adresi
keycloak.realm -> Oluşturduğumuz Realm adı
keycloak.resource -> Oluşturduğumuz client ID
keycloak.public-client -> Oluşturduğumuz client Public olduğu için bunu true olarak belirledik. Bu kısım client’ın access type alanına göre değiştirilebilir. Biz demo uygulama yaptığımız için şimdilik public.
6- GloabalSecurityConfiguration adında bir sınıf oluşturalım ve KeycloakWebSecurityConfigurerAdapter sınıfını extend edelim.
package com.example.springbootkeycloak; import org.keycloak.adapters.KeycloakConfigResolver; import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; @EnableWebSecurity public class GloabalSecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter { @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Bean public KeycloakConfigResolver KeycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http.authorizeRequests() .antMatchers("/").permitAll() .anyRequest().authenticated(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); auth.authenticationProvider(keycloakAuthenticationProvider); } }
7- Son olarak REST endpointi tanımlayalım. hello adresine bir istek gittiğinde kullanıcı login sayfasına yönlenecek ve logout sayfasına gidildiğinde oluşturulan oturum silinecek ve tekrardan login sayfasına yönlenmiş olacak. getName() metodu ile kullanıcı giriş yaptıktan sonra ismini ekrana basmış olduk.
package com.example.springbootkeycloak; import org.keycloak.KeycloakPrincipal; import org.keycloak.KeycloakSecurityContext; import org.keycloak.representations.AccessToken; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @RestController public class HelloController { @GetMapping("/hello") public ResponseEntity<String> hello(Authentication authentication){ if (authentication.getPrincipal() instanceof KeycloakPrincipal) { KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>) authentication.getPrincipal(); AccessToken token = kp.getKeycloakSecurityContext().getToken(); final String body = "Hi, " + token.getName(); return ResponseEntity.ok(body); } return new ResponseEntity<>("Unauthorized", HttpStatus.UNAUTHORIZED); } @GetMapping(path = "/logout") public void logout(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException { request.logout(); httpServletResponse.setHeader("Location", "/hello"); httpServletResponse.setStatus(302); } }
Tüm aşamaları tamamlamış olduk. Şimdiyse test edelim.
Spring projemizi run edelim ve http://localhost:8080/hello/ adresine istek atalım. Karşımıza login sayfası gelecek. Oluşturduğumuz kullanıcı ile login olalım. Giriş yaptıktan sonra http://localhost:8080/logout adresine giderek çıkış yapabilirsiniz.
http://localhost:8085/auth/realms/demo/protocol/openid-connect/token adresine istek atarken body kısmından x-www-form-urlencoded seçerek client_id, grant_type, username, password alanları gönderiniz.
Üretilen access_token JWT token olarak üretilmiştir. https://jwt.io/ adresine bu access token’ı yapıştırarak token içerisindeki bilgilere erişebilirsiniz.
The post Keycloak Kullanarak Güvenli Java Spring Boot REST API Uygulaması first appeared on Kampüs Kod.]]>
Sorumuzun cevabunı hemen verelim Bir sınıfı thread-safe yapmak istiyorsanız immutable yapmanız gerekmektedir. Immutable nesnelerin değerleri değişmeyeceği için üzerinde ne kadar thread çalışırsa çalışsın hep aynı değerler üzerinden işlem yapılacaktır. Bu noktada ortaya çıkan bir dezavantajlık söz konusuda var tabii. Immutable nesnelerin dezavantajı ise, değerin değişmesini istiyorsak yeni bir nesne oluşturmamız gerekiyor. Bu da zaman, bellek ve garbage collector maliyetleri oluşturmaktadır.
Örnek bir Immutable Sınıf yapısı aşağıdaki gibidir:
public final class ImmutablePerson { private final String name; public ImmutablePerson(String name) { this.name = name; } public String getName() { return name; } }
The post Java İmmutable ve Mutable Nedir? – Java Dersleri first appeared on Kampüs Kod.]]>
Java’da 8 farklı ilkel veri tipi vardır. İlkel veri tiplerini 4 ana başlık altında toparlayabiliriz:
İlkel veri tiplerini daha detaylı bir sonraki yazımızda inceleyeceğiz.
The post Java’da İlkel Veri Tipleri Nelerdir? (Primitive Data Types) – Java Dersleri first appeared on Kampüs Kod.]]>ORM tool (aracı), veri oluşturma, veri değiştirme ve veri erişimini basitleştirir. Veritabanı üzerinde saklanan verilere nesne eşleyen bir programlama tekniğidir.
ORM tool, veritabanıyla etkileşim kurmak için JDBC API kullanır.
Java Persistence API (JPA), ORM araçlarına (tools) belirli fonksiyonellik ve standart sağlayan bir Java spesifikasyonudur. javax.persistence paketi, JPA sınıfları ve arayüzlerini içerir.
Hibernate framework’u LGPL lisansı altında açık kaynak kodludur ve hafiftir.
Hibernate Framework’nun performansı hızlıdır çünkü cache (önbellek) kullanılır. Hibernate Framework’te iki tür cache vardır: İlk Seviye Cache ve İkinci Seviye Cache. İlk Seviye Cache varsayılan olarak gelmektedir.
HQL (Hibernate Query Language (Hibernate Sorgu Dili)) SQL’in nesne yönelimli bir versiyonudur. Veritabanından bağımsız sorgular üretir. Böylece, veritabanına özgü sorgular yazmanıza gerek yoktur. Hibernate’den önce, proje için veritabanı değiştirilirse, bakım problemlerine yol açan SQL sorgusunu da değiştirmemiz gerekir.
Hibernate Framework, veritabanı tablolarını otomatik olarak oluşturmak için kolaylık sağlar. Bu yüzden, veritabanındaki tabloları manuel olarak eklenmesine gerek yoktur.
Hibernate Framework’te birçok tablodan veri çekmek, kolaydır.
Hibernate, sorgu önbelleğini (cache) destekler ve sorgu ve veritabanı durumu hakkında istatistikler sağlar.
Kaynaklar
The post Hibernate Nedir? Hibernate Framework Avantajları – Java Dersleri first appeared on Kampüs Kod.]]>Erişim düzey belirleyiciler, diğer sınıfların belirli bir alanı kullanıp kullanmayacağını veya belirli bir yöntemi çağırıp çağıramayacağını belirler. Erişim kontrolünün iki seviyesi vardır:
//no explicit modifier: Anlamı paket erişimidir. Basitçe açıklarsak, oluşturduğunuz herhangi bir sınıfla aynı paketi paylaşan bir sınıf metotlarınızı görebilir veya kullanabilir. Üst sınıfla aynı pakette olmadıkça alt sınıflar metotlarınızı göremez veya kullanamaz.
Bir sınıf, public belirleyicisiyle bildirilebilir, bu durumda bu sınıf, her yerdeki tüm sınıflarda görülebilir. Bir sınıfın belirleyicisi yoksa (varsayılan (default), package-private olarakta bilinir), o sadece kendi paketinin içinde görünürdür. (paketler ilişkili sınıfların grupları olarak isimlendirilir – sonraki bir derste bunları öğreneceksiniz.)
Üye seviyesinde, ayrıca public belirleyici kullanabilirsiniz veya üst seviye sınıflarda olduğu gibi ve aynı anlama gelen belirleyicisiz (package-private) kullabilirsiniz. Açıklamak gerekirse; belirleyicisiz dediğimiz herhangi bir erişim belirleyici kullanmamaktır. Eğer ki bir erişim belirleyici kullanmazsanız, sadece kendi paket içinde görünür. Üyeler için, ek iki erişim belirleyici vardır: private ve protected. Private belirleyici, üyeye sadece kendi sınıfı içinde erişilebileceğini belirtir. Protected belirleyici, üyeye sadece kendi paketi içinde (package-private ‘da olduğu gibi) ve ek olarak başka paketteki onun sınıfının bir alt sınıfı tarafından erişilebileceğini belirtir.
Aşağıdaki tablo her belirleyici tarafından izin verdiği üyelere erişim gösterilmektedir.
Modifier (Belirleyici) | Class (Sınıf) | Package (Paket) | Subclass (Alt sınıf) | World (Tüm Proje) |
public | Evet | Evet | Evet | Evet |
protected | Evet | Evet | Evet | Hayır |
no modifier | Evet | Evet | Hayır | Hayır |
private | Evet | Hayır | Hayır | Hayır |
İlk veri sütunu, sınıfın kendisinin erişim seviyesi tarafından tanımlanan üyeye erişimi olup olmadığını gösterir. Gördüğünüz gibi, bir sınıfın her zaman kendi üyelerine erişimi vardır. İkinci sütun, sınıfla benzer paketteki sınıfların (ebeveynliklerini dikkate almadan) üyeye erişimi olup olmadığını gösterir. Üçüncü sütun, bu paketin dışında bildirilen sınıfın alt sınıflarının üyeye erişimi olup olmadığını gösterir. Dördüncü sütun, tüm sınıfların üyeye erişimi olup olmadığını gösterir.
Erişim seviyeleri iyi şekilde sizi etkiler. Birincisi, başka bir kaynaktan gelen sınıfları kullandığınızda, örneğin Java platformundaki sınıflar, erişim seviyeleri kendi sınıflarınızın hangi üyelerini kullanabileceğini belirler. İkincisi, bir sınıf yazdığınızda, sınıfınızdaki her üye değişkenin ve her metotun hangi erişim seviyesine sahip olması gerektiğine karar vermeniz gerekir.
Bir sınıf koleksiyonuna bakalım ve erişim seviyelerinin görünürlüğü nasıl etkilediğini görelim. Aşağıdaki şekil bu örnekteki 4 sınıfı ve ilişkilerinin nasıl olduğunu gösterir.
Aşağıdaki tablo, Alpha sınıfının üyelerinin, kendilerine uygulanabilen erişim belirleyicilerin her birisi için nerede göründüklerini gösterir.
Modifier (Belirleyici) | Alpha | Beta | Alphasub | Gamma |
public | Evet | Evet | Evet | Evet |
protected | Evet | Evet | Evet | Hayır |
no modifier | Evet | Evet | Hayır | Hayır |
private | Evet | Hayır | Hayır | Hayır |
Bir Erişim Seviyesi Seçme İpuçları
Başka programcılar sizin sınıfınızı kullanırsa, yanlış kullanımdan meydana gelen hataların oluşmamasını sağlamak istersiniz. Erişim seviyeleri bunu yapmak için size yardım edebilir.
Bu yazı Oracle Java Dökümanı kullanılarak İngilizceden Türkçeye çevrilmiştir. Sadece kaynak göstererek kullanabilirsiniz.
The post Java Erişim Belirleyiciler (Access Modifier) – Java Dersleri first appeared on Kampüs Kod.]]>GET metotu belirtilen bir kaynaktan veri istemek için kullanılır. GET en yayın HTTP metotlarından biridir. GET metotunda gönderilen istekler URL üzerinden gönderilir.
/kampuskod/demo_form.php?isim1=deger1&isim2=deger2
POST metotu, işlenmiş verileri belirtilen bir kaynağa gönderir. POST metotu en yaygın HTTP metotlarından biridir. POST metotunda, gönderilen istekler HTTP mesaj gövdesinde gönderilir.
POST /kampuskod/demo_form.php HTTP/1.1
Host: kampuskod.com
isim1=deger1&isim2=deger2
GET | POST | |
Geri Butonu / Sayfa Yenileme | Sorunsuzdur. Yenilenen veya gidilen sayfa kaybolmaz. | Gidelen sayfa için tarayıcı re-submit uyarısı verir. |
Yer İmleme | Yer imi olarak eklenebilir. | Yer imi olarak eklenemez. |
Önbellekte Tutulma | Tutulabilir. | Tutulamaz. |
Kodlama Tipi (Encoding type) | application/x-www-form-urlencoded | application/x-www-form-urlencoded veya multipart/form-data |
Tarayıcı Geçmişi | Parametreler / Değişkenler tarayıcı geçmişinde kalır. | Parametreler / Değişkenler tarayıcı geçmişinde kalmaz. |
Karakter Limiti | URL Maksimum 2048 karakterden oluşabilir. | Kısıtlama yoktur. |
Veri Tipi Kısıtlaması | Sadece ASCII karakterlerine izin verilir. | Kısıtlama yoktur. Ayrıca Binary veri izinlidir. |
Güvenlik | POST ile kıyaslandığında daha az güvenlidir. Parolaları veya diğer hassas bilgileri ASLA GET kullanarak göndermeyin. | GET ile kıyaslandığında daha güvenlidir. Çünkü parametreler tarayıcı geçmişinde veya web sunucu kayıtlarında tutulamaz. |
Görünürlük | Veri, URL üzerinde herkese görünürdür. | Veri, URL üzerinde görülemez. |
Kaynaklar
https://www.javatpoint.com/get-vs-post
https://www.w3schools.com/tags/ref_httpmethods.asp
Bir web tarayıcısı istemci (client) olabilir ve web sitesini barındıran bir bilgiyasardaki uygulama sunucu olabilir.
Örneğin; bir istemci (tarayıcı), sunucuya bir HTTP isteği gönderir, sonra sunucu istemciye bir yanıt döner. Yanıt, istek hakkında durum bilgisini içerir ve ayrıca istenen içeriği de barındırabilir.
Servletler, bir Web veya uygulama sunucusu üzerinde çalışan ve bir Web tarayıcısından veya başka bir HTTP istemcisinden gelen istekler ile HTTP sunucusu üzerindeki veritabanları veya uygulamalar arasında orta bir katman gibi davranan programlardır. (Çok karmaşık gelmiş olabilir bu tanım, şekil ile açıklayalım )
Servlet, dinamik bir web uygulaması oluşturmak için sunucu (server) üzerinde uygulamayı çalıştıran bir web bileşenidir. Servlet bir Java sınıfıdır.
Servetler, büyük ölçekli geliştirme projelerini destekleyen Java sınıf kütüphanelerinin genişletilmiş bir versiyonu olan Java Enterprise Edition’un (Kurumsal Sürüm) standart bir parçası olan javax.servlet ve javax.servlet.http paketleri kullanılarak oluşturulabilir.
init() moetotu sadece bir kez çağrılır. Sadece servlet oluşturulduğunda init() metotu çağrılır ve daha sonra herhangi bir kullanıcı istekleri için çağrılmaz.
Servlet normalde bir kullanıcı servlet’e karşılık gelen bir URL’i ilk kez çağırdığında oluşturulur ancak, sunucu ilk başlatıldığında servlet yüklenmesini dahi belirtebilirsiniz.
init() metot imzası:
public void init() throws ServletException {
// Initialization code...
}
Service metotu, asıl görevleri gerçekleştirmek için ana metottur. Servlet konteyneri, istemciden(tarayıcılardan) genlen istekleri karşılamak ve istemciye yanıt dönmek için service() metotunu çağırır.
Service metotu, HTTP istek tipini (GET, POST, PUT, DELETE vb.) kontrol eder ve doGet, doPost, doPut, doDelete gibi metotları uygun şekilde çağırır.
service metot imzası:
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
}
Bir GET isteği, normal bir URL isteğinden veya tanımlanmış metotu olmayan bir HTML formundan kaynaklanır ve doGet() metotu tarafından karşılanmalıdır.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
Bir POST isteği, metot olarak POST alan bir HTML formundan kaynaklanır ve doPost() metotu tarafından karşılanmalıdır.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
Destroy metotu, servletin yaşam döngüsünün en sonunda sadece bir kez çağrılır. Bu metot, veritabanı bağlantılarını kapatmak, arka plandaki threadleri durdurmak vb. işleri yapmak için servlet’e bir şans verir.
Destroy metotu çağrıldıktan sonra, servlet nesnesi çöp toplama (garbage collection) için işaretlenir.
destroy metotu tanımlaması:
public void destroy() {
// Finalization code...
}
Yararlandığım Kaynaklar
https://www.tutorialspoint.com/servlets/index.htm
https://docs.oracle.com/javaee/7/api/javax/servlet/Servlet.html
The post Java Servlet Nedir? – Java Dersleri first appeared on Kampüs Kod.]]>Java Platformu, kendi uygulamalarınızda kullanmak için uygun çok büyük bir sınıf kütüphanesi (bir dizi paket) sağlar. Bu kütüphane “Application Programming Interface” veya kısaca “API” olarak bilinir. Onun paketleri, genel amaçlı programlama (general-purpose programming) ile en yaygın ilişkilendirilmiş (associated) görevleri temsil eder. Örneğin, bir String objesi (nesne) karakter stringler için durum ve davranış içerir, bir File (dosya) objesi, dosya sistemi üzerinde bir dosyayı kolayca oluşturmak, silmek, incelemek, karşılaştırmak veya değiştirmek için programcıya izin verir, bir Socket objesi, ağ soketlerinin oluşturulması ve kullanılması için izin verir, çeşitli GUI objeleri, butonları ve onay kutularını (checkboxes) ve grafiksel kullanıcı arayüzleri ilgili başka herhangi bir şeyi kontrol eder. Kelimenin tam anlamıyla seçim yapabileceğiniz binlerce sınıf vardır. Bu, programcının çalışmasını sağlamak için gereken altyapıdan ziyade belli uygulamanızın tasarımı üzerine odaklanmanıza imkan verir.
Java Platformu API Şartnamesi/Beyannamesi/Tanımlaması Java SE platformu tarafından sağlanan bütün paketler (packages), arayüzler (interfaces), sınıflar (classes), alanlar (fields) ve metotlar (methods) için bütün listeyi içerir. Tarayıcınıza sayfayı yükleyin ve onu yer imleyin. Bir programcı olarak, Java Platformu API Şartnamesi en önemli tek referans dokümanınız olacaktır.
Bu yazı Oracle Java Dökümanı kullanılarak İngilizceden Türkçeye çevrilmiştir. Sadece kaynak göstererek kullanabilirsiniz.
The post Java Paket Nedir? Java Package Yapısı – Java Dersleri first appeared on Kampüs Kod.]]>Interface’in en yaygın hali, bir interface, boş gövdelerle birlikte ilgili metotların bir grubudur. Bir bisikletin davranışı, bir interface (arayüz) gibi belirtildiyse, aşağıdaki gibi görünür;
interface Bicycle {
// wheel revolutions per minute
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
Bu interface’i uygulamak için, sınıfınızın adı değişecekti (örneğin, ACMEBicycle gibi belirli bir bisiklet markasına) ve class (sınıf) tanımlamasında “implements” anahtar kelimesini kullanırsınız.
class ACMEBicycle implements Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
// The compiler will now require that methods
// changeCadence, changeGear, speedUp, and applyBrakes
// all be implemented. Compilation will fail if those
// methods are missing from this class.
//Derleyici şimdi changeCadence, changeGear, speedUp, and applyBrakes metotlarının
//uygulanmasını zorunlu tutacaktır. Eğer şu metotlar, bu sınıftan eksikse, derleyici başarız olur.
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
Bir interface’ın uygulanması, bir sınıfın sağlamayı söz verdiği davranış hakkında daha düzgün / kurallara göre olmasını sağlar. Interfaceler, sınıf ve dış dünya arasında bir anlaşma oluşturur ve bu anlaşma derleyici tarafından inşa zamanında zorla uygulanır. Sınıfınız bir interface’i uygulamayı talep ederse,sınıf başarıyla derlenmeden önce bu interface tarafından tanımlanmış bütün metotlar sınıfın kaynak kodunda görünmeli.
Not: Aslında ACMEBicycle sınıfını derlemek için, uygulanmış interface metotlarının başına “public” anahtar kelimesin eklenmeye ihtiyacı vardır. Gelecek derslerde bu kısımlara detaylıca değinmeye çalışacağız.
Bu yazı Oracle Java Dökümanı kullanılarak İngilizceden Türkçeye çevrilmiştir. Sadece kaynak göstererek kullanabilirsiniz.
The post Java Interface (Arayüz) Nedir? – Java Dersleri first appeared on Kampüs Kod.]]>