Большинство примеров написания Java-примера X в Clojure, которые я видел, - это аккуратные фрагменты или алгоритмы.Мне интересно, как создавать программы с Clojure.Мой рабочий пример Java содержит всего 81 строку, но показывает объект User, который взаимодействует с объектом MessageServer.Дополнительно загружает объекты из текстового файла с разделителями-пробелами.Также можете представить, что нужно добавить больше полей и методов для пользователя.
Как мне написать эту программу на Java в idiomatic Clojure?
// To run User.java, just do:
// % echo "iradik 555-5555" > users.txt && javac User.java && java User users.txt 555-5555
// Result should be:
// Messages for user iradik with phone 555-5555 are Hello!, Hello Again!
import java.io.*;
import java.util.*;
public class User {
public static class PhoneNumberNotFoundException extends RuntimeException { }
String id;
String phoneNumber;
String[] messages;
private static Map<String, User> PHONE_MAP = new HashMap<String, User>();
public void getTextMessages() {
if (messages == null || MessageServer.isChanged(this)) {
MessageServer.getMessages(this);
}
}
public void printTextMessages() {
StringBuilder builder = new StringBuilder();
if (messages.length > 0) {
builder.append(messages[0]);
}
for (int i = 1; i < messages.length; ++i) {
builder.append(", ");
builder.append(messages[i]);
}
System.out.println("Messages for user " + id + " with phone " + phoneNumber + " is " + builder.toString());
}
public static User getUserForPhoneNumber(String phoneNumber) {
User user = PHONE_MAP.get(phoneNumber);
if (user == null) { throw new PhoneNumberNotFoundException(); }
return user;
}
public static void initializeFromFile(String filename) throws IOException {
FileInputStream fstream = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
String[] d = strLine.split(" ");
User user = new User();
user.id = d[0];
user.phoneNumber = d[1];
PHONE_MAP.put(user.phoneNumber, user);
}
in.close();
}
/**
* Run this:
* echo "steve 555-5555" > users.txt && javac User.java && java User users.txt 555-5555
*/
public static void main(String[] args) throws IOException {
User.initializeFromFile(args[0]);
User user = User.getUserForPhoneNumber(args[1]);
user.getTextMessages();
user.printTextMessages();
}
}
class MessageServer {
static boolean isChanged(User user) {
return true;
}
static void getMessages(User user) {
user.messages = new String[] {"Hello!", "Hello Again!"};
}
}