В классе Foo вы можете поместить аннотации @Getter и @Setter в класс, чтобы избежать дублирования (обратите внимание, что если вы добавляете в этот класс другие закрытые атрибуты, которые не могут быть публичными, вы должны удалить аннотацию @Getter, чтобы выставить атрибут private):
@Getter
@Setter
public class Foo
О методе getWithBytesAndValues я предлагаю вам поместить этот метод в класс Foo, потому что этот метод позволяет получить атрибуты Foo и установить другие атрибуты Foo (бизнес-правило взято из домена Foo - см. Дизайн, управляемый доменом). Вы также можете разделить внутреннюю логику двумя способами:
public class Foo {
...
public void setBytes()
setByte1();
setByte2();
}
private void setByte2() {
if (getByte2String() != null) {
setByte2(new Base64(getByte2String()).decode());
if (getByte2Value() == null) {
setByte2Value(DEFAULT_BYTE_VALUE);
}
}
}
private void setByte1() {
if (getByte1String() != null) {
setByte1(new Base64(getByte1String()).decode());
if (getByte1Value() == null) {
setByte1Value(DEFAULT_BYTE_VALUE);
}
}
}
}
Служебные расходы ... нет.
Определение метода и адрес кода хранятся в объекте Class, который имеет уникальный экземпляр, на который указывает каждый экземпляр вашего объекта. Поскольку это было бы так, независимо от того, добавили ли вы этот метод, накладные расходы для каждого отдельного объекта - ничто.
As a few other people at least have said, the method is not stored in the serialization.
You can easily do a test to show this in this example with the following code.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializationTest {
public static void main(String[] args) {
serialize(true);
serialize(false);
}
public static void serialize(boolean aOrB) {
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream("output.txt");
out = new ObjectOutputStream(fos);
out.writeObject(aOrB ? new A() : new B());
out.close();
fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
File file = new File("output.txt");
System.out.println(file.length());
}
public static class A implements Serializable {
int a = 0;
}
public static class B implements Serializable {
int a = 0;
public int foo(int a) {
return a;
}
}
}
For me this prints out
48
48
80 байт, поскольку метод не включен в объект. Если только вы не говорите о типе «vtable», в этом случае, вероятно, 160 байт.
Уточнение по 160 байтам. 160 было бы, если бы каждый объект выделил свою собственную vtable (что является одной из возможных реализаций) В качестве альтернативы (и, как указано в комментариях), лучшим способом будет один vtable на класс, что будет означать 80 + размер указателя на vtable (вероятно, 4 или 8 байтов в зависимости от виртуальной машины). Итак, 84 или 88 байт.
Все это полностью зависит от того, как виртуальная машина выделяет память и работает с неконечными методами. Не зная, как реализована конкретная виртуальная машина, ни на один вопрос нельзя ответить правильно.
Метод не сохраняется в сериализованной форме. Это так просто.
Редактировать: Что касается объектов в ВМ во время выполнения, размер должен быть постоянным, независимо от того, сколько методов имеет класс объекта.
Объекты обоих классов будут использовать около 20-24 байтов для 32/64-битных JVM.
Официальная документация для HTMLParser
: Python 2.7
>>> import HTMLParser
>>> pars = HTMLParser.HTMLParser()
>>> pars.unescape('© €')
u'\xa9 \u20ac'
>>> print _
© €
Официальная документация для HTMLParser
: