Неизменные бобы в Java

wget не поддерживает шаблон / шаблон в опции -O (заглавная буква O, BTW). Таким образом, вы можете сделать несколько хитростей, например сначала поместить файл во временный каталог, а затем переименовать его с помощью оболочки. Что-то вроде:

for i in {1..50}; 
do  
    mkdir $i && cd $i && \
    wget --content-disposition `http://example.com/getfile.php?id={$i}` && \
    for fn in *; do mv "$fn" "../$i-$fn" && cd .. && rmdir $i; done
done

Примечание: не проверено.

5
задан Francis Stephens 21 November 2008 в 01:55
поделиться

3 ответа

Я думаю, что использовал бы шаблон делегации - делают класс ImmutableDate с единственным членом DateBean, который должен быть указан в конструкторе:

public class ImmutableDate implements DateBean
{
   private DateBean delegate;

   public ImmutableDate(DateBean d)
   {
      this.delegate = d;
   }

   public Date getDate()
   {
      return delegate.getDate();
   }
}

Если когда-нибудь я должен вызвать неизменность на DateBean d, я просто новый ImmutableDate (d) на нем. Я, возможно, был умен и удостоверился, что не делегировал делегата, но Вы получаете идею. Это избегает проблемы клиента, пытающегося бросать его во что-то изменяемое. Это во многом как JDK, делает с Collections.unmodifiableMap () и т.д. (в тех случаях, однако, функции мутации все еще должны быть реализованы и кодируются для выдачи исключения на этапе выполнения. Намного легче, если у Вас есть основной интерфейс без мутаторов).

Все снова и снова это - утомительный шаблонный код, но это - вид вещи, которую хороший IDE как Eclipse может автоматически сгенерировать для Вас всего несколькими щелчками мышью.

Если это - вид вещи, Вы заканчиваете тем, что делали к большому количеству объектов области, Вы могли бы хотеть рассмотреть использование динамических прокси или возможно даже AOP. Было бы относительно легко затем создать прокси для любого объекта, делегировав все получить методы, и захватив или игнорируя методы установки как соответствующие.

2
ответ дан 14 December 2019 в 13:50
поделиться

Я использую интерфейсы и бросающий для управления переменчивостью бобов. Я не вижу серьезных оснований для усложнения моих объектов области с методами как getImmutableInstance() и getMutableInstance().

Почему не только используют наследование и абстракцию? например.

public interface User{

  long getId();

  String getName();

  int getAge();

}

public interface MutableUser extends User{

  void setName(String name);

  void setAge(int age);

}

Вот то, что будет делать клиент кода:

public void validateUser(User user){
  if(user.getName() == null) ...
}

public void updateUserAge(MutableUser user, int age){
  user.setAge(age);
}

Это отвечает на Ваш вопрос?

yc

1
ответ дан 14 December 2019 в 13:50
поделиться

Некоторые комментарии (не обязательно проблемы):

  1. Класс Даты самостоятельно изменяем, таким образом, Вы правильно копируете его для защиты неизменности, но лично я предпочитаю преобразовывать в долго в конструкторе и возвращать новую Дату (longValue) в методе считывания.
  2. Оба Ваших getWhateverInstance () методы возвращают DateBean, который требует бросать, это могла бы быть идея изменить интерфейс для возврата определенного типа вместо этого.
  3. Сказав все, что я был бы склонен просто иметь два класса одно изменяемое и один неизменный, совместно использовав общее (т.е. получить только) интерфейс при необходимости. Если Вы думаете, что будет много преобразования, назад и вперед затем добавляют конструктора копии к обоим классам.
  4. Я предпочитаю, чтобы неизменные классы объявили, что поля как финал заставляют компилятор осуществить неизменность также.

например.

public interface DateBean {
    public Date getDate();
}

public class ImmutableDate implements DateBean {
    private final long date;

    ImmutableDate(long date) {
       this.date = date;
    }

    ImmutableDate(Date date) {
       this(date.getTime());
    }

    ImmutableDate(DateBean bean) {
       this(bean.getDate());
    }

    public Date getDate() {
         return new Date(date);
    }
}


public class MutableDate implements DateBean {
    private long date;

    MutableDate() {}

    MutableDate(long date) {
       this.date = date;
    }

    MutableDate(Date date) {
       this(date.getTime());
    }

    MutableDate(DateBean bean) {
       this(bean.getDate());
    }

    public Date getDate() {
        return new Date(date);
    }

    public void setDate(Date date) {
        this.date = date.getTime();
    }

}
3
ответ дан 14 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

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