Как я делаю конструктора доступным только для класса фабрики?

Аналогично Ответу Стефана , но с Отражением , а также игнорирует все пользовательские (внешние) обновления, созданные / обновленные времена. Шоу Гист

  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();
        }

6
задан Donato Szilagyi 29 November 2013 в 20:01
поделиться

6 ответов

Вы могли бы сделать 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();
        }
    }
}
5
ответ дан 9 December 2019 в 20:48
поделиться

Вы можете предоставить доступ к пакету конструктора CShoe и поместить CShoe и CFactory в том же пакете.

5
ответ дан 9 December 2019 в 20:48
поделиться

Во-первых, если вы сохраните все созданные экземпляры, это называется утечкой. Я продолжу предполагать, что вы имеете в виду нестрогую ссылку, ограниченный или какой-то другой такой кэш, а также что 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;
    }
    ...
}
1
ответ дан 9 December 2019 в 20:48
поделиться

Поскольку вы хотите добавить каждый объект на карту, вы также можете переместить эту логику в конструктор CShoe - объект добавится сам.

1
ответ дан 9 December 2019 в 20:48
поделиться

Не могли бы вы просто передать экземпляр вызывающего объекта в качестве аргумента статического члена обуви и выполнить там проверку типа isInstanceOf, которая вызывает конструктор, если он истинен?

0
ответ дан 9 December 2019 в 20:48
поделиться

Вы могли бы передать объект фабрики в конструктор?

public CShoe(CFactory factory)
{
    if (factory == null ||
          !factory.isValid()) // or whatever
    {
        throw new IllegalArgumentException();
    }
}
0
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: