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

Odpowiedz Nowy wątek
2014-12-16 15:24
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.

Popraw tytuł wątku na sensownie opisujący problem, albo wątek wyląduje w koszu; - furious programming 2014-12-16 15:41
@Dregorio Dlaczego o języku można się dowiedzieć dopiero jak przeczyta się treść posta? Przy przeglądaniu ma to znaczenie, bo nie wszystkie języki znam/mnie interesują. Podpowiedź: używaj tagów - Sarrus 2014-12-16 15:46
@Dregorio - w tagach nie widzę języka, dorzuć i tę informację; - furious programming 2014-12-16 15:48

Pozostało 580 znaków

2014-12-16 15:27
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ć.

Pozostało 580 znaków

2014-12-16 15:30
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ś.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2014-12-16 15:38
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.

edytowany 2x, ostatnio: Dregorio, 2014-12-16 15:42

Pozostało 580 znaków

2014-12-16 15:48
0

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

Pozostało 580 znaków

2014-12-16 15:49
0

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


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.
Nie - on chce mieć jedną, ale listę obiektów - Sarrus 2014-12-16 15:51
*Po co m lista singletonów, a nie faktycznych obiektów (stringów w tym przypadku). - datdata 2014-12-16 15:54
Przeczytaj post jeszcze raz. Jedna lista obiektów jakichś tam. Czyli lista jako singleton - nie lista singletonów - Sarrus 2014-12-16 15:59
Dlatego pytam po co mu lista singletonów. - datdata 2014-12-16 16:02
A odróżniasz sumę kwadratów od kwadratu sumy? - somekind 2014-12-16 16:17

Pozostało 580 znaków

2014-12-16 15:50
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;
}
 
edytowany 4x, ostatnio: Sarrus, 2014-12-16 15:58

Pozostało 580 znaków

2014-12-16 16:02
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.

Pozostało 580 znaków

2014-12-16 16:16
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

Pozostało 580 znaków

2014-12-16 16:22
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.

Pozostało 580 znaków

2014-12-16 16:59
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()

edytowany 1x, ostatnio: Sarrus, 2014-12-16 16:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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