Правильный шаблон проектирования для изменения экземпляра типа данных во время выполнения

63
5

Я думал о том, чтобы использовать общий шаблон фабрики для этого, однако я просто хочу убедиться, что я правильно его использую.

Прежде всего, это должно быть основано на Java, из-за потребностей клиента.

Мое приложение может создавать несколько объектов, и каждый из этих объектов должен иметь возможность изменять тип во время выполнения. Например, переменная может начинаться как float, быть преобразована в int, затем в char, а затем обратно в float. Это будет основным примером, однако пользовательские типы данных могут быть добавлены для дополнительного удовольствия.

Является ли общий шаблон завода правильным для использования в этом случае? Или, что-то лучше? Мне кажется, что фабричная модель лучше работает при создании экземпляра и не обновляется (если только я не уничтожил и не повторно создал переменную).

Более детально:

Это эволюционный алгоритм, в котором я не обязательно знаю типы при запуске программы. Может показаться, что int более желательно, чем float, основываясь на эволюции.

Например, если я начинаю с значения с плавающей запятой 4.34:

// start of program
object var = 4.34;

// evolution running......
...

// evolution determines that var would be better as a float
var.convertToInt();

// var is now an int with a value of 4

Моя первоначальная мысль состояла в том, чтобы иметь общий объект типа фабрики, где я отслеживаю текущий "тип" объекта и возвращаю соответствующее значение. Таким образом, вначале он вернет float, и после преобразования будет возвращено значение int-convert (сопоставлено с внутренним int).

Редактирование 2: Прояснение кода.

Думаю, моя точка просто не проходит. Вот пример того, что я ожидаю увидеть, по коду.

object var = new object(int, 4);    // create int variable with value of 4
// where object is whatever base design pattern i am using here
...
var.toFloat(); // convert var to float, value is now 4.0
System.out.println(var.getValue()); // prints 4.0
...
var.toCustomClass(); // var is now a custom datatype
System.out.println(var.getValue()); // calls the print method of the class

Следует также упомянуть, что экземпляр var должен сохраняться на протяжении всего выполнения, поскольку он является объектом моего эволюционного алгоритма и не может быть уничтожен и повторно создан как нечто другое.

спросил(а) 2021-01-19T16:21:56+03:00 6 месяцев, 1 неделя назад
1
Решение
64

Если вы объясните, почему вы хотите это сделать, это может помочь. Ваш лучший выбор, основанный на том, что вы сказали до сих пор, будет состоять в том, чтобы всегда использовать тип как Number, а затем хранить любую версию, в которой вы нуждаетесь. Например number.toInt, number.toDouble и т.д.

Для более сложных типов определите общий интерфейс, который все они реализуют и сохраняют с помощью этого интерфейса, затем пишут соответствующие методы сопоставления или используют библиотеку, такую как Dozer, чтобы выполнить сопоставление для вас.

Вам нужно будет создать свой собственный класс, чтобы справиться с этим. Например:

public class Value {
Object value;

Object getValue();

void toInteger() {
if (value instanceof Number) {
value = Integer.valueOf(((Number)value).intValue());
} else {
// Handle the conversion however you handle it
}
}
}

ответил(а) 2021-01-19T16:21:56+03:00 6 месяцев, 1 неделя назад
45

Может быть, это может помочь.

Предоставляя общий метод, тип возвращаемого значения присваивается типу переменной для сохранения результата. ClassCastException будет запущен, если типы не совместимы


public class Wrapper {

private Object src;

public Wrapper(Object o) {
src = o;
}
public String getType(){
return src.getClass().getName();
}

public <E> E getValue() {
return (E)src;
}
public void toInteger(){
//dummy implementation
if(src instanceof Double){
src=new Integer(String.valueOf((int)Math.floor((Double)src)));
}
}

public static void main(String args[]){
Wrapper wrapper=new Wrapper(new Double(4.8));
System.out.println(wrapper.getType());
Double myDouble=wrapper.getValue();
System.out.println(myDouble);
wrapper.toInteger();
System.out.println(wrapper.getType());
Integer myInteger=wrapper.getValue();
// Double exceptionInProgress = wrapper.getValue();
System.out.println(myInteger);
}

}

ответил(а) 2021-01-19T16:21:56+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема