Аналогично Ответу Стефана , но с Отражением , а также игнорирует все пользовательские (внешние) обновления, созданные / обновленные времена. Шоу Гист
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries().Where(x => x.Entity.GetType().GetProperty("CreatedTime") != null))
{
if (entry.State == EntityState.Added)
{
entry.Property("CreatedTime").CurrentValue = DateTime.Now;
}
else if (entry.State == EntityState.Modified)
{
// Ignore the CreatedTime updates on Modified entities.
entry.Property("CreatedTime").IsModified = false;
}
// Always set UpdatedTime. Assuming all entities having CreatedTime property
// Also have UpdatedTime
// entry.Property("UpdatedTime").CurrentValue = DateTime.Now;
// I moved this part to another foreach loop
}
foreach (var entry in ChangeTracker.Entries().Where(
e =>
e.Entity.GetType().GetProperty("UpdatedTime") != null &&
e.State == EntityState.Modified ||
e.State == EntityState.Added))
{
entry.Property("UpdatedTime").CurrentValue = DateTime.Now;
}
return base.SaveChanges();
}
Вы могли бы сделать Shoe
внутренним классом
из ShoeFactory
:
public class ShoeFactory {
public static class Shoe {
private String name;
private Shoe() {
}
private Shoe(String name) {
this.name = name;
}
}
public static Shoe createShoe(String shoeName) {
return new Shoe(shoeName);
}
}
Я думаю, что это в значительной степени охватывает все случаи, кроме .... отражения :
public class SmellyShoe {
public static void main(String[] args) {
try {
java.lang.reflect.Constructor c = Shoe.class.getDeclaredConstructors()[0];
c.setAccessible(true);
Shoe smelly = (Shoe)c.newInstance(null);
// grr
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
Вы можете предоставить доступ к пакету конструктора CShoe и поместить CShoe и CFactory в том же пакете.
Во-первых, если вы сохраните все созданные экземпляры, это называется утечкой. Я продолжу предполагать, что вы имеете в виду нестрогую ссылку, ограниченный или какой-то другой такой кэш, а также что Shoe
неизменяемый.
Просто используйте метод static
, чтобы вернуть factory.
public final class Shoe implements Footwear {
private static final FootwearFactory<Shoe,Something> FACTORY =
new FootwearFactory<Shoe,Something>() {
...
public Shoe get(Something value) {
value = new Something(value);
...
return new Show(value);
}
};
private static FootwearFactory<Shoe,Something> getFactory() {
return FACTORY;
}
private final Something value;
private Shoe(Something value) {
this.value = value;
}
...
}
Поскольку вы хотите добавить каждый объект на карту, вы также можете переместить эту логику в конструктор CShoe - объект добавится сам.
Не могли бы вы просто передать экземпляр вызывающего объекта в качестве аргумента статического члена обуви и выполнить там проверку типа isInstanceOf, которая вызывает конструктор, если он истинен?
Вы могли бы передать объект фабрики в конструктор?
public CShoe(CFactory factory)
{
if (factory == null ||
!factory.isValid()) // or whatever
{
throw new IllegalArgumentException();
}
}