JavaRush /Java Blog /Random-ID /Level 37. Jawaban pertanyaan wawancara pada topik level
lichMax
Level 40
Санкт-Петербург

Level 37. Jawaban pertanyaan wawancara pada topik level

Dipublikasikan di grup Random-ID
Halo. Sekali lagi, saya juga tidak menemukan jawaban atas pertanyaan-pertanyaan ini. Saya memutuskan untuk memposting jawaban yang saya kumpulkan untuk diri saya sendiri. Level 37. Jawaban pertanyaan wawancara tentang topik level - 1Berikut adalah pertanyaan sebenarnya: Pertanyaan untuk wawancara:
  1. Apa itu pola desain?
  2. Pola desain apa yang Anda ketahui?
  3. Ceritakan kepada kami tentang pola Singleton? Bagaimana cara membuatnya aman untuk thread?
  4. Beritahu kami tentang pola Pabrik?
  5. Beritahu kami tentang pola AbstrakFactory
  6. Ceritakan tentang pola Adaper, perbedaannya dengan Wrapper?
  7. Beritahu kami tentang pola Proxy
  8. Apa itu iterator? Antarmuka terkait iterator apa yang Anda ketahui?
  9. Mengapa kita membutuhkan kelas Arrays?
  10. Mengapa kita membutuhkan kelas Koleksi?
Inilah jawaban saya: Jawaban saya:
  1. Pola desain adalah solusi yang mapan dan berhasil terhadap permasalahan paling umum yang muncul selama desain dan pengembangan program atau bagian-bagiannya.

  2. Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy, Bridge, MVC.

  3. Ketika Anda hanya memerlukan satu instance kelas untuk ada dalam suatu program, polanya digunakan Singleton. Tampilannya seperti ini (inisialisasi malas):

    clas Singleton {
    	private Singleton instance;
    
    	private Singleton() {}
    
    	public static Singletot getInstance() {
    		if (instance == null)
    			instance = new Singleton();
    		return instance;
    	}
    }

    Untuk membuatnya aman untuk thread, Anda dapat menambahkan getInstance()pengubah ke metode ini synchronized. Tapi ini bukan solusi terbaik (tapi yang paling sederhana). Solusi yang jauh lebih baik adalah dengan menulis metode getInstanceseperti ini (periksa ulang penguncian):

    public static synchronized Singleton getInstance() {
    	if (instance == null)
    		synchronized(Singleton.class) {
    			instance = new Singleton();
    		}
    	return instance;
    }

  4. Pola Factoryadalah pola generatif. Ini memungkinkan Anda membuat objek sesuai permintaan (misalnya, dalam kondisi tertentu). Ini terlihat seperti ini:

    class Factory{
    	public static Object1 getObject1() {
    		return new Object1();
    	}
    
    	public static Object2 getObject2() {
    		return new Object2();
    	}
    
    	public static Object3 getObject3() {
    		return new Object3();
    	}
    }

    Ada juga variasi pola ini yang disebut FactoryMethod. Menurut pola ini, objek berbeda dibuat dalam satu metode, bergantung pada data masukan yang masuk (nilai parameter). Semua objek ini harus memiliki nenek moyang yang sama (atau antarmuka umum yang dapat diimplementasikan). Ini terlihat seperti ini:

    class FactoryMethod {
    	public enum TypeObject {
    		TYPE1,
    		TYPE2,
    		TYPE3
    	}
    
    	public static CommonClass getObject(TypeObject type) {
    		switch(type) {
    			case TYPE1:
    				return new Object1();
    			case TYPE2:
    				return new Object2();
    			case TYPE3:
    				return new Object3();
    			default:
    				return null;
    		}
    	}
    }

    Kelas Object1, Object2dan Object3mewarisi dari kelas CommonClass.

  5. Suatu pola Abstract Factoryjuga merupakan pola desain generatif. Berdasarkan pola ini maka terciptalah pabrik abstrak yang berfungsi sebagai acuan bagi beberapa pabrik beton. Berikut ini contohnya:

    class Human {}
    
    class Boy extends Human {}
    class TeenBoy extends Human {}
    class Man extends Human {}
    class OldMan extends Human {}
    
    class Girl extends Human {}
    class TeenGirl extends Human {}
    class Woman extends Human {}
    class OldWoman extends Human {}
    
    interface AbstractFactory {
    	Human getPerson(int age);
    }
    
    class FactoryMale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Boy();
    		if (age >= 12 && age <= 20)
    			return new TeenBoy();
    		if (age > 20 && age < 60)
    			return new Man();
    		return new OldMan();
    	}
    }
    
    сlass FactoryFemale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Girl();
    		if (age >= 12 && age <= 20)
    			return new TeenGirl();
    		if (age > 20 && age < 60)
    			return new Woman();
    		return new OldWoman();
    	}
    }

  6. Pola Adapteradalah pola struktural. Implementasinya memungkinkan objek dari satu tipe untuk digunakan di mana objek dari tipe lain diperlukan (biasanya tipe abstrak). Contoh penerapan pola ini:

    interface TotalTime {
    	int getTotalSeconds();
    }
    interface Time {
    	int getHours();
    	int getMinutes();
    	int getSeconds();
    }
    
    class TimeAdapter extends TotalTime {
    	private Time time;
    	public TimeAdapter(Time time) {
    		this.time = time;
    	}
    	public int getTotalTime() {
    		return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60;
    	}
    }
    
    class TotalTimeAdapter extends Time {
    	private TotalTime totalTime;
    	public TotalTimeAdapter(TotalTime totalTime) {
    		this.totalTime = totalTime;
    	}
    
    	public int getSeconds() {
    		return totalTime % 60;
    	}
    
    	public int getMinutes() {
    		return (totalTime / 60) % 60;
    	}
    
    	public int getHours() {
    		return totaltime/ (60 * 60) ;
    	}
    }
    
    class Main {
    	public static void main(String[] args) {
    		Time time = new Time() {
    			public int getSeconds() {
    				return LocalTime.now().getSecond();
    			}
    
    			public int getMinutes() {
    				return LocalTime.now().getMinute();
    			}
    
    			public int getHours() {
    				return LocalTime.now().getHour() ;
    			}
    		};
    
    		TotalTime totalTime = new TimeAdapter(time);
    		System.out.println(totalTime.getTotalSeconds());
    
    		TotalTime totalTime2 = new TotalTime() {
    			public int getTotalSeconds() {
    				LocalTime currTime = LocalTime.now();
    				return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60;
    			}
    		};
    
    		Time time2 = new TotalTimeAdapter(totalTime2);
    		System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds());
    	}
    }

    Saat mengimplementasikan suatu pola Wrapper, sebuah kelas dibuat yang membungkus kelas asli dan mengimplementasikan antarmuka yang sama dengan yang diimplementasikan oleh kelas asli. Dengan demikian, ini memungkinkan Anda untuk memperluas fungsionalitas kelas asli dan menggunakan kelas baru di mana kelas asli diharapkan akan digunakan. Hal ini berbeda dengan penerapan pola Adapteryang dalam hal ini hanya menggunakan antarmuka tunggal (sama dengan kelas aslinya). Polanya Adaptermenggunakan dua antarmuka, dan kelas yang membungkus instance kelas asli mengimplementasikan antarmuka yang sama sekali berbeda, bukan antarmuka kelas asli.

  7. Pola Proxyadalah pola desain struktural. Hal ini diperlukan untuk mengontrol akses ke beberapa objek. Untuk melakukan ini, kelas tipe "wrapper" ditulis, yaitu objek asli yang mengimplementasikan antarmuka tertentu dilewatkan di dalam kelas, kelas itu sendiri juga mengimplementasikan antarmuka ini, dan di setiap metode kelas ini metode serupa dipanggil pada objek aslinya. Menerapkan antarmuka yang sama dengan objek asli memungkinkan Anda mengganti objek asli dengan objek proxy. Hal ini juga memungkinkan, tanpa mengubah objek aslinya, untuk “melampirkan” beberapa fungsi tambahan khusus ke metodenya (misalnya, logging, memeriksa hak akses, caching, dll.). Contoh:

    interface Bank {
    	void setUserMoney(User user, double money);
    	double getUserMoney(User user);
    }
    
    class CitiBank implements Bank { //оригинальный класс
    	public void setUserMoney(User user, double money) {
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		UserDAO.getUserMoney(user);
    	}
    }
    
    class SecurityProxyBank implements Bank {
    	private Bank bank;
    
    	public SecurityProxyBank(Bank bank) {
    		this.bank = bank;
    	}
    
    	public void setUserMoney(User user, double money) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't change money value");
    
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't get money value");
    
    		UserDAO.getUserMoney(user);
    	}

  8. Iterator adalah objek internal khusus dari suatu koleksi yang memungkinkan Anda melakukan iterasi secara berurutan melalui elemen-elemen koleksi ini. Objek ini harus mengimplementasikan antarmuka Iterator<E>, atau ListIterator<E>(untuk daftar). Selain itu, untuk mengulangi elemen koleksi, koleksi tersebut harus mendukung Iterable<E>. Antarmuka Iterable<E>hanya berisi satu metode iterator(), yang memungkinkan Anda mengakses iterator koleksi dari luar.

    Antarmuka Iterator<E>berisi metode berikut:

    • boolean hasNext()— memeriksa apakah ada elemen lain dalam koleksi

    • E next()— memungkinkan Anda mendapatkan elemen koleksi berikutnya (setelah menerima elemen, kursor iterator internal berpindah ke elemen koleksi berikutnya)

    • void remove()- menghapus elemen saat ini dari koleksi

    Интерфейс же ListIterator<E> содержит такие методы:

    • boolean hasNext() — проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим)

    • E next() — возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент)

    • int nextIndex() — возвращает индекс следующего element

    • void set(E e) — устанавливает meaning текущего element void add(E e). Добавляет элемент в конец списка.

    • boolean hasPrevious() — проверяет, существует ли Howой-то элемент в коллекции перед данным элементом

    • E previous() — возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции

    • int previousIndex — возвращает индекс предыдущего element коллекции

    • void remove() — удаляет текущий элемент коллекции

    • void add(E e) — добавляет элемент e после текущего element коллекции

  9. Класс Arrays — это утorтарный класс, предназначенный для разнообразных манипуляций с массивами. В этом классе есть методы превращения массива в список, поиска по массиву, копирования массива, сравнения массивов, получения хешcodeа массива, представление массива в виде строки и др.

  10. Класс Collections — это утorтарный класс для работы с коллекциями. В этом классе есть методы добавления элементов в коллекцию, наполнения коллекции elementми, поиска по коллекции, копировании коллекции, сравнения коллекции, нахождения максимального и минимального элементов коллекции, а также методы получения специфический модификаций коллекций известных типов (например, можно получить потокобезопасную коллекции or неизменяемую коллекцию с одним элементом).

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION