Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Java (https://forum.zone-game.info/forumdisplay.php?f=126)
-   -   Возможно ли сохранить ссылку на класс? (https://forum.zone-game.info/showthread.php?t=42333)

flopix 31.05.2017 14:36

Возможно ли сохранить ссылку на класс?
 
Есть класс SomeClass который реализовывает интерфейс SomeInterface

Код:

public interface SomeInterface
{
        public void onAction();
}


public class SomeClass implements SomeInterface
{
        @Override
        public void onAction()
        {
                //code
        }
}

Есть массив который хранит список объектов, чтобы в нужный момент можно их было перебрать и вызвать в каждом метод onAction().
Код:

List<SomeInterface> siList;

Все понятно если создается экземпляр класса SomeClass.
Код:

SomeClass sc = new SomeClass();
siList.add(sc);


А что если SomeClass будет использоваться как статический класс, без создания экземпляра. Возможно ли в таком случае сохранить список классов реализовывающих интерфейс SomeInterface для перебора?

shegan 31.05.2017 17:47

Re: Возможно ли сохранить ссылку на класс?
 
Нет такого понятия как "статический класс".
Есть паттерн "одиночка".
Пример же простой, почему бы не проверить самому?

Код:
PHP код:

package com.company;

import java.util.ArrayList;
import java.util.List;

public class 
Main {

    public static 
void main(String[] args) {
        List<
Basicbasics = new ArrayList<>();
        
basics.add(new ChildBasic("I'm child and i'm not alone!"));
        
basics.add(new ChildBasic("Pew pew, hello, my name is ChildBasic"));
//        basics.add(new ForeverAloneBasic()); нельзя так сделать, ибо конструктор приватный
        
basics.add(ForeverAloneBasic.getInstance());
        
basics.add(ForeverAloneBasic.getInstance());
        
basics.add(new ChildBasic("Another child!"));

        
System.out.println("1st run...");

        for (
Basic basic basics) {
            
basic.doAction();
        }

        
ForeverAloneBasic.getInstance().setMessage("LEAVE ME FFS");

        
System.out.println("\n2nd run...");

        for (
Basic basic basics) {
            
basic.doAction();
        }
    }
}

interface 
Basic {
    
void doAction();
}

class 
ChildBasic implements Basic {

    private 
String message;

    public 
ChildBasic(String message) {
        
this.message message;
    }

    @
Override
    
public void doAction() {
        
System.out.println(this.getClass().getName() + " " message);
    }

}

class 
ForeverAloneBasic implements Basic {
    private 
String message "I'm forever alone, leave me.";

    private static 
ForeverAloneBasic instance = new ForeverAloneBasic();
    public static 
ForeverAloneBasic getInstance() {
        return 
instance;
    }

    private 
ForeverAloneBasic() {
        
// запрещаем создание экземпляра
    
}

    public 
void setMessage(String message) {
        
this.message message;
    }

    @
Override
    
public void doAction() {
        
System.out.println(this.getClass().getName() + " " message);
    }


Вывод:

PHP код:

1st run...
com.company.ChildBasic I'm child and i'm not alone!
com.company.ChildBasic Pew pewhellomy name is ChildBasic
com
.company.ForeverAloneBasic I'm forever alone, leave me.
com.company.ForeverAloneBasic I'
m forever aloneleave me.
com.company.ChildBasic Another child!

2nd run...
com.company.ChildBasic I'm child and i'm not alone!
com.company.ChildBasic Pew pewhellomy name is ChildBasic
com
.company.ForeverAloneBasic LEAVE ME FFS
com
.company.ForeverAloneBasic LEAVE ME FFS
com
.company.ChildBasic Another child


flopix 31.05.2017 18:08

Re: Возможно ли сохранить ссылку на класс?
 
В вашем примере в обоих классах создаются их экземпляры с помощью оператора new.
В моем случае экземпляр класса создаваться не будет.

shegan 31.05.2017 18:17

Re: Возможно ли сохранить ссылку на класс?
 
Я могу, конечно, написать решение, но оно того не стоит.
Что за задача такая, где понадобился такой странный подход?

flopix 31.05.2017 18:46

Re: Возможно ли сохранить ссылку на класс?
 
Да решил допилить в старой Ц4 сборке более гибкую поддержку скриптов для эвентов.
Я уже сделал с созданием экземпляров каждого класса. Но потом подумал а зачем создавать экземпляры если он используется только в одном месте. Вот стало интересно как реализовать.

shegan 31.05.2017 20:33

Re: Возможно ли сохранить ссылку на класс?
 
В таком случае создавайте объект по имени класса, и вызывайте соответствующий метод.
Т.е. руками не надо будет писать new, достаточно указать имена классов в конфиге, или ещё где-то.

flopix 31.05.2017 23:02

Re: Возможно ли сохранить ссылку на класс?
 
Да мне не сложно добавить new. Тут вопрос чисто спортивного интереса.

FaintSmile 02.06.2017 07:20

Re: Возможно ли сохранить ссылку на класс?
 
почитайте про рефлекшоны


Текущее время: 18:59. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot