Masukkan Password
36 Public & private members in Dart | Dart visibility | Dart Tutorial #35
Video ini membahas public dan private member di Dart, terutama bagaimana _ (underscore) digunakan untuk membuat sebuah member menjadi private.
Ada satu istilah di transkrip yang salah karena hasil speech-to-text: ketika disebut “diet”, “dot dot type”, atau sejenisnya, maksudnya adalah Dart dan .dart file/library.
Yang paling penting dari materi ini adalah memahami bahwa private di Dart sedikit berbeda dengan Java/C++.
1. Apa itu public dan private?
Sebelum masuk kode, pahami konsep sederhananya.
Bayangkan kita punya sebuah rumah:
Rumah
├── Pintu depan
├── Ruang tamu
└── Kamar pribadi
Hal yang boleh diakses orang luar → public.
Hal yang hanya boleh digunakan di area tertentu → private.
Dalam Dart, penentu sederhananya adalah:
name
berarti public.
Sedangkan:
_name
berarti private.
Jadi perbedaan utamanya adalah underscore:
name → public
_name → private
Ini berlaku bukan hanya untuk variable/field, tetapi juga untuk member lain seperti method, getter, setter, dan sebagainya.
2. Public member
Contoh:
class Person {
String name = "Sam";
int age = 21;
}
name dan age adalah public karena tidak diawali _.
Kita bisa mengaksesnya dari tempat lain yang memiliki akses ke library tersebut.
Misalnya kita punya dua file:
project/
├── main.dart
└── person.dart
person.dart
class Person {
String name = "Sam";
int age = 21;
}
main.dart
import 'person.dart';
void main() {
Person p = Person();
print(p.name);
print(p.age);
}
Output:
Sam
21
Kenapa bisa?
Karena:
String name
int age
adalah public member.
3. Private member menggunakan _
Sekarang ubah:
class Person {
String _name = "Sam";
int _age = 21;
}
Perhatikan:
_name
_age
diawali underscore _.
Artinya member tersebut menjadi private terhadap library.
Ini adalah aturan penting Dart:
Identifier yang diawali underscore
_bersifat private terhadap library tempat identifier tersebut didefinisikan.
4. Contoh menggunakan dua file
Misalnya:
project/
├── main.dart
└── person.dart
person.dart
class Person {
String _name = "Sam";
int _age = 21;
}
Kemudian:
main.dart
import 'person.dart';
void main() {
Person p = Person();
print(p._name);
print(p._age);
}
Ini akan menghasilkan error.
Kenapa?
Karena:
person.dart
↓
Person
├── _name 🔒 private
└── _age 🔒 private
main.dart
↓
berada di library berbeda
main.dart tidak bisa langsung mengakses _name dan _age.
5. Ini yang sangat penting: private Dart bukan “private hanya di dalam class”
Kalau kamu pernah belajar Java, mungkin kamu terbiasa dengan:
private String name;
dan menganggap private berarti:
hanya bisa diakses dari dalam class.
Di Dart konsepnya berbeda.
Dart tidak menggunakan:
private
protected
public
untuk mekanisme ini.
Dart menggunakan:
_name
dan private-nya berlaku pada library, bukan hanya class.
6. Apa itu library dalam Dart?
Untuk pemahaman pemula, kamu bisa menganggap library sebagai unit kode yang memiliki batas visibility.
Dalam kasus sederhana, file Dart sering menjadi library.
Misalnya:
person.dart
berisi:
class Person {
String _name = "Sam";
}
Kemudian:
main.dart
mengimpor:
import 'person.dart';
Maka main.dart menggunakan library dari person.dart.
Member:
_name
tetap private terhadap library person.dart.
7. Kenapa ketika class dipindahkan ke main.dart, _name bisa diakses?
Ini bagian paling menarik dari video.
Misalnya awalnya:
person.dart
class Person {
String _name = "Sam";
}
main.dart
import 'person.dart';
void main() {
Person p = Person();
print(p._name); // ERROR
}
Karena Person dan main() berada di library berbeda.
Sekarang pindahkan class Person ke main.dart:
class Person {
String _name = "Sam";
}
void main() {
Person p = Person();
print(p._name);
}
Sekarang:
main.dart
│
├── class Person
│ └── _name
│
└── main()
└── p._name
Keduanya berada dalam library yang sama.
Maka:
print(p._name);
bisa dilakukan.
Output:
Sam
Jadi yang menentukan bukan:
“Apakah kode berada di dalam class atau di luar class?”
Tetapi:
“Apakah kode tersebut berada di library yang sama atau berbeda?”
Ini perbedaan yang sangat penting.
8. Private bukan berarti tidak bisa digunakan sama sekali
Ini juga sering disalahpahami.
Kalau kita membuat:
class Person {
String _name = "Sam";
}
bukan berarti _name tidak bisa digunakan.
_name tetap bisa digunakan oleh kode yang berada dalam library yang sama.
Contoh:
class Person {
String _name = "Sam";
void showName() {
print(_name);
}
}
Ini valid.
Bahkan dari class lain dalam library yang sama, secara prinsip member private tersebut juga dapat diakses.
Contoh:
class Person {
String _name = "Sam";
}
class Test {
void show(Person person) {
print(person._name);
}
}
Jika keduanya berada dalam library yang sama, _name dapat diakses.
Jadi:
PRIVATE
↓
bukan "hanya class ini yang boleh mengakses"
tetapi lebih tepat:
"kode di luar library ini tidak boleh mengaksesnya secara langsung"
9. Public vs private
Sekarang kita buat perbandingan sederhana.
Public
class Person {
String name = "Sam";
int age = 21;
}
Dari library lain:
Person p = Person();
print(p.name);
print(p.age);
Bisa.
Private
class Person {
String _name = "Sam";
int _age = 21;
}
Dari library lain:
Person p = Person();
print(p._name); // ❌
print(p._age); // ❌
Tidak bisa secara langsung.
10. Private juga berlaku untuk method
Bukan hanya variable.
Contoh:
class Person {
String name = "Sam";
void showName() {
print(name);
}
void _secretMethod() {
print("Ini private");
}
}
Di sini:
showName()
adalah public.
Sedangkan:
_secretMethod()
adalah private.
Dari library lain:
p.showName(); // ✅
p._secretMethod(); // ❌
11. Private juga bisa digunakan pada getter dan setter
Misalnya:
class Person {
String _name = "Sam";
String get name {
return _name;
}
set name(String value) {
_name = value;
}
}
Di sini:
_name
adalah private.
Tetapi:
name getter
name setter
bisa menjadi public.
Dari luar:
Person p = Person();
print(p.name);
p.name = "Budi";
Kita tidak menyentuh _name secara langsung.
Kita berinteraksi melalui getter/setter.
12. Kenapa kita perlu private?
Ini berkaitan erat dengan encapsulation (enkapsulasi).
Misalnya kita membuat class:
class BankAccount {
double balance = 0;
}
Karena balance public, kode luar bisa melakukan:
account.balance = -100000000;
Padahal mungkin saldo tidak boleh negatif.
Lebih baik:
class BankAccount {
double _balance = 0;
double get balance {
return _balance;
}
void deposit(double amount) {
if (amount > 0) {
_balance += amount;
}
}
}
Sekarang kode luar tidak bisa sembarangan mengubah:
_balance
Kita menyediakan cara yang lebih terkontrol:
account.deposit(100000);
Ini salah satu manfaat utama private member.
13. Private + getter/setter
Pola ini sangat sering digunakan.
Contohnya:
class Person {
String _name = "";
String get name {
return _name;
}
set name(String value) {
if (value.isNotEmpty) {
_name = value;
}
}
}
Kemudian:
void main() {
Person p = Person();
p.name = "Budi";
print(p.name);
}
Output:
Budi
Perhatikan kita tidak melakukan:
p._name = "Budi";
Kita menggunakan:
p.name = "Budi";
Setter akan menangani perubahan tersebut.
14. Getter itu seperti pintu untuk membaca
Bayangkan:
Private data
↓
_name
↓
getter
↓
name
↓
dunia luar
Contoh:
String get name {
return _name;
}
Ketika kita menulis:
print(p.name);
sebenarnya getter name yang dijalankan.
15. Setter itu seperti pintu untuk mengubah
Misalnya:
set name(String value) {
_name = value;
}
Ketika kita menulis:
p.name = "Budi";
Dart menjalankan setter tersebut.
Secara konsep:
p.name = "Budi"
↓
setter name(...)
↓
_name = "Budi"
Jadi getter dan setter memberikan kita kontrol terhadap bagaimana data dibaca dan diubah.
16. Public/private tidak hanya berlaku pada instance member
Kamu juga bisa memiliki static member.
Misalnya:
class Person {
static int total = 0;
static int _secretTotal = 0;
}
Maka:
total → public static
_secretTotal → private static
Begitu juga method:
class Person {
static void hello() {
print("Hello");
}
static void _secret() {
print("Secret");
}
}
Jadi aturan sederhananya:
tanpa _ → public
dengan _ → private library
17. Jangan salah memahami _
Underscore tidak berarti:
“variable ini tidak boleh digunakan.”
Bukan begitu.
Contoh:
class Person {
String _name = "Sam";
void changeName(String newName) {
_name = newName;
}
}
Ini justru penggunaan private yang normal.
_name boleh digunakan di dalam library tempat ia berada.
Yang dibatasi adalah akses langsung dari luar library.
18. Contoh lengkap dengan dua file
Supaya benar-benar jelas, bayangkan struktur:
lib/
├── main.dart
└── person.dart
person.dart
class Person {
String name = "Sam";
int age = 21;
String _secret = "Rahasia";
void showData() {
print(name);
print(age);
print(_secret);
}
}
main.dart
import 'person.dart';
void main() {
Person p = Person();
print(p.name); // ✅
print(p.age); // ✅
p.showData(); // ✅
print(p._secret); // ❌
}
Dari main.dart:
name → ✅ public
age → ✅ public
showData() → ✅ public
_secret → ❌ private
Tetapi di person.dart:
void showData() {
print(name);
print(age);
print(_secret);
}
semuanya bisa digunakan karena masih berada dalam library yang sama.
19. Analogi sederhana: rumah dan kompleks
Bayangkan library = satu rumah.
Di dalam rumah:
Rumah A
├── ruang tamu
├── dapur
├── kamar
└── brankas rahasia
Public:
ruang tamu
Bisa diakses dari luar.
Private:
brankas rahasia
Hanya kode yang berada dalam “rumah/library” tersebut yang bisa mengakses secara langsung.
Kalau pindah ke:
Rumah B
tidak bisa langsung membuka brankas Rumah A.
Tetapi Rumah A bisa menyediakan “pintu resmi”, misalnya getter/method:
Rumah A
↓
method/getter
↓
informasi yang boleh diberikan
Inilah ide dasar encapsulation.
20. Hal yang perlu diluruskan dari video
Ada beberapa poin yang sebaiknya kamu catat supaya tidak membawa pemahaman yang salah.
❌ “Private hanya bisa diakses di dalam class”
Kurang tepat.
✅ Yang benar:
Dart menggunakan library privacy.
_name
hanya dapat diakses secara langsung dari library tempat _name didefinisikan.
❌ “Private berarti tidak bisa diakses dari luar class”
Juga kurang tepat.
Kalau kode tersebut masih berada dalam library yang sama, kode dari class lain pun dapat mengakses member private tersebut.
❌ Dart punya keyword private
Tidak seperti Java:
private String name;
Dart menggunakan:
String _name;
21. Hubungan dengan materi sebelumnya
Sebelumnya kamu sudah belajar:
class
object
reference
field
method
constructor
getter
setter
Sekarang tambahkan:
CLASS
│
┌──────────────┼──────────────┐
↓ ↓ ↓
field method constructor
│ │
↓ ↓
┌─────────┐ ┌──────────┐
│ public │ │ public │
│ private │ │ private │
└─────────┘ └──────────┘
Penentunya sederhana:
name → public
_name → private
showData() → public
_showData()→ private
22. Cheat sheet
| Bentuk | Arti |
|---|---|
name | Public |
_name | Private terhadap library |
showData() | Public method |
_showData() | Private method |
get name | Getter |
set name(...) | Setter |
static count | Public static |
static _count | Private static |
Dan yang paling penting:
PUBLIC
→ bisa digunakan dari library lain
PRIVATE (_)
→ akses langsung dibatasi ke library tempat member dibuat
23. Kesimpulan paling sederhana
Kalau kamu hanya mengingat 5 hal dari video ini, ingat ini:
1. Public
String name = "Sam";
Tidak menggunakan _.
2. Private
String _name = "Sam";
Diawali _.
3. Private Dart adalah library-private
Bukan sekadar:
private hanya di dalam class.
Tetapi:
private terhadap library tempat member tersebut didefinisikan.
4. Private sangat berguna untuk encapsulation
Misalnya:
class Person {
String _name = "";
String get name => _name;
set name(String value) {
if (value.isNotEmpty) {
_name = value;
}
}
}
Kita menyembunyikan data internal:
_name
dan menyediakan akses yang terkontrol:
name
5. _ adalah simbol yang sangat penting dalam Dart
Saat nanti masuk Flutter, kamu akan sering melihat pola seperti:
class MyWidget {
String _name = "";
void _doSomething() {
// ...
}
}
Jadi setiap kali kamu melihat:
_name
atau:
_doSomething()
langsung pikirkan:
“Oh, ini member private terhadap library.”
Itulah inti materi public dan private member di Dart.