Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Возможно ли сохранить ссылку на класс?
#1
Есть класс 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 для перебора?
Ответ
#2
Нет такого понятия как "статический класс".
Есть паттерн "одиночка".
Пример же простой, почему бы не проверить самому?

Код:
PHP код:
<?php 
package com
.company;

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

public class
Main {

public static
void main(String[] args) {
List<
Basic> basics = 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 код:
<?php 
1st run
...
com.company.ChildBasic I'm child and i'm not alone!
com.company.ChildBasic Pew pew, hello, my name is ChildBasic
com
.company.ForeverAloneBasic I'm forever alone, leave me.
com.company.ForeverAloneBasic I'
m forever alone, leave me.
com.company.ChildBasic Another child!

2nd run...
com.company.ChildBasic I'm child and i'm not alone!
com.company.ChildBasic Pew pew, hello, my name is ChildBasic
com
.company.ForeverAloneBasic LEAVE ME FFS
com
.company.ForeverAloneBasic LEAVE ME FFS
com
.company.ChildBasic Another child!
Ответ
#3
В вашем примере в обоих классах создаются их экземпляры с помощью оператора new.
В моем случае экземпляр класса создаваться не будет.
Ответ
#4
Я могу, конечно, написать решение, но оно того не стоит.
Что за задача такая, где понадобился такой странный подход?
Ответ
#5
Да решил допилить в старой Ц4 сборке более гибкую поддержку скриптов для эвентов.
Я уже сделал с созданием экземпляров каждого класса. Но потом подумал а зачем создавать экземпляры если он используется только в одном месте. Вот стало интересно как реализовать.
Ответ
#6
В таком случае создавайте объект по имени класса, и вызывайте соответствующий метод.
Т.е. руками не надо будет писать new, достаточно указать имена классов в конфиге, или ещё где-то.
Ответ
#7
Да мне не сложно добавить new. Тут вопрос чисто спортивного интереса.
Ответ
#8
почитайте про рефлекшоны
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)