Czy można użyć Singleton przy liście obiektów?

0

Zabrałem się za Jave. Doszedłem do obiektówki i jeśli mam być szczery to jest to moje pierwsze starcie. Pisałem w C++ na klasach, ale daleko temu było do obiektowego programu. Mam problem z przestawieniem się, zabrałem się za wzorce, a dokładnie za Singletona. Zastanawiam się, czy jest możliwość utworzenia w tym wzorcu listy obiektów? Może ktoś będzie miły i naskrobie mi przykład? Albo choć powie, czy w prosty sposób można zmodyfikować, program dla jednej instancji. Bo ja miałem kilka prób i żadna się nie udała.

0

Singleton to wzorzec istnienia tylko jednego obiektu. A to co on zawiera to już wola programisty. Czyli listę oczywiście może przechować.

Podaj jakiś kod który naskrobałeś i nie działa. Wtedy będziemy mogli coś poradzić.

0

@Dregorio rozumiem że chodzi ci o n-gleton / pulę obiektów? Jasne że można. Tak samo jak singleton. Pokaż jak próbowałeś.

0
import java.util.List;

public class Singleton
{
	private static List<Singleton> list = null;
	public String name;
	
	private Singleton()
	{
		
	}
	
	public static Singleton getInstanceList()
	{
		if(list == null)
		{
			list = new List<Singleton>();
		}
		return list; // w sumie nie wiem co ma zwrócić w innym wypadku
	}


	public static void main(String[] args) 
	{
		Singleton s1 = Singleton.getInstanceList();
		Singleton s2 = Singleton.getInstanceList();
		
		s1.name = "Zenobia";
		s2.name = "Patryk";
		
		list.add(s1);
		list.add(s2);
		
	}

} 

Zaznaczam to mój drugi dzień z Java.
EDIT. To jest mój bodaj 2 albo 3 przykład.
EDIT2. Chodzi mi o to by uzyskać taki efekt by przy dodawaniu np. rowerów nie tworzyło mi nowych obiektów jeśli to nie jest konieczne.

0

To się nie skompiluje, bo name jest polem Singleton, a nie listy, którą zwracasz.

0

Namieszałeś. Skoro nigdy nie powstanie więcej niż jedna instancja klasy Singleton, to po co Ci ich lista?

1
Koziołek napisał(a):

To się nie skompiluje, bo name jest polem Singleton, a nie listy, którą zwracasz.

Poza tym metoda getInstance() ma typ zwracany Singleton, a zwraca listę.
EDIT:
Odpowiadając na pytanie: można tak zrobić jak kombinujesz owszem. Ale to wygląda dziwnie i nieintuicyjnie, ponieważ zazwyczaj singleton to jeden obiekt. Powinieneś zrobić mniej więcej tak:

public class Singleton
{
    private static instance = null;
    public List<MyClass> list = null; //pewnie powinno być private + gettery i settery ale mniejsza o to
    
    private Singleton()
    {
       list = new List<MyClass>();
    }
 
    public static Singleton getInstance()
    {
        if(instance == null)
        {
           instane = new Singleton();
        }
        return instance; 
    }
}
public class MyClass
{
    public String name;
}
 
0

@Sarrus 1. Więc nie powinno się robić tak jak chcę? 2. Twoje rozwiązanie mnie się trochę nie podoba bo u mnie klasa SIngleton ma być tak naprawdę klasą rower z polami marka, cena, nazwa, kolor i mam stworzyć listę takich obiektów. A SIngleton używam by mi się obiekty nie powtarzały. Zalecenie prowadzącego.

0

A co będzie pilnować, żeby obiekty się nie powtarzały? Bo to jak próbowałeś zrobić zapewniasz sobie, że się lista obiektów nie powtórzy, ale na samej liście możesz mieć dwa razy ten sam obiekt, albo dwa obiekty o identycznych właściwościach. Mając klasę odpowiedzialną za przechowywanie obiektów, możesz jej też zlecić sprawdzanie czy taki obiekt nie istnieje. W zasadzie to wzorzec na jakim powinieneś się opierać, to nie singleton, a repozytorium

0

@Sarrus na moją głowę Singleton mi nie pasował, ale nie miałem wyboru. Prowadzący sobie zażyczył. Więc jak mam zrobić by mieć jak mówisz. Myślałem, że jeśli dam List<Singleton> to będę mógł przechowywać obiekty swojej klasy.

0

Dobrze, ale jak chcesz utworzyć te obiekty? Masz prywatny konstruktor i nie masz metody do tworzenia tychże. W sensie nigdzie nie ma new Singleton()

0

@Sarrus AAAAA chyba już załapałem, mam zrobić klase "SIngletonowa" z listą jak pokazałeś i klase Rower, Stworzyć listę obiektów rower? Czyli zamiast MyClass, Rower ?

0

No tak. Zrób, pokaż, ocenimy.

0

@Sarrus wyskakują błędy "Cannot instantiate the type List<MyClass>"

0

Bo List to interface... Musisz stworzyć jakieś LinkedList albo ArrayList

0

Poprawiłem program, nie tworzyłem nowego projektu/klasy/paczki, zmieniłem kilka linijek. Wyskakuje mi błąd: The selection cannot be launched, and there are no recent launches. To co znalazłem na necie nie pomaga mi w naprawie problemu.

1

Polecam singleton robić na enum, jest prościej, nie trzeba sprawdzać czy instancja istnieje i jest bezpieczny przy wielowątkowości

public enum EasySingleton{
    INSTANCE;
}

http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html

0

Z powodów niezależnych ode mnie zapomniałem w ogóle o tym temacie.

  1. Błąd naprawiłem poprzez ręczne wpisanie nazwy klasy głównej. Do tej pory nie wiem jak mogłem tego nie widzieć.
  2. Jestem trochę głupi bo w sumie na wykładzie było, ale mnie akurat nie było. To co tak naprawdę chciałem zrobić to użyć multitona. Na swoje usprawiedliwienie dodam, że miałem strasznie zakręcone ostatnie 3 miesiące.
    Dzięki wszystkim za rady i pomoc :) Przepraszam za wprowadzanie w błąd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1