powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Объекты типа String, Integer, Double и т.д., как аргументы функции
25 сообщений из 29, страница 1 из 2
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32934863
студент1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите, а что, объекты классов Integer, String, Double и т.д. нельзя использовать для передачи их по ссылке в качестве аргумента функции с последующим изменением значения и возвратом изменённного значения из фунции.
Например такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public   class  mainClass {

	 public   static   void  main(String[] args) {
		String s = "Old String value";
		updateString(s);
		System.out.println(s);
	}
	 public   static   void  updateString(String str) {
		str = "New String Value";
	}
}
возвращает
Код: plaintext
Old String value

Вопрос: Неужели для этого всегда надо писать свой класс обёртку для Stringa и передавать функции для изменения не сам String а этот класс обёртку? Дико как-то... Или я чего-то не догоняю?
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32935182
java != javascript
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, не догоняешь.

у метода есть входные пораметры и выходной. вот его и меняй.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	 public   static   void  main(String[] args) {
		String s = "Old String value";
		s = updateString(s);
		System.out.println(s);
	}

	 public   static  String updateString(String str) {
		 return  "New String Value";
             }

Только не приводи, пожалуйста, пример с методом, в котором 28 параметров, 19 из которых Immutable(как стринг) и которые нужно изменить после вызова метода.

Это называется идиотский оо дизайн и обсуждению не подлежит.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32935323
Guest_569123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В книге Брюса Эккеля написанно int, Double, и тд ("простые типы") создаются для большей скорости в стеке и передаются по значению. Вызов оператора new создает объект в куче и передается объект по ссылке. (Не дословно, но примерно так).

public class mainClass {

public static void main(String[] args) {
String s; //ссылка на объект
s = new String("Old String value");//новый объект
updateString(s);//передача объекта по ссылке (??????)
System.out.println(s);//хрен вам по ссылке
}
public static void updateString(String str) {
str = "New String Value";
}
}

Так почему объект передан не по ссылке.????
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32935416
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Guest_569123
Так почему объект передан не по ссылке.????


вот потому.. :)

В java все параметры грубо говоря, копируются :(
так что прости прощай передача параметров по адресу :((
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32935795
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никаких "оберток" для String писать не надо - есть StringBuffer, в котором можно изменять значение строки. Его и используй. Далее - изменять значение переданных экземпляров классов - НЕЛЬЗЯ. Можно менять только их состояние. Integer, Double, Long и прочие реализованы так, что изменить их содержание без создания нового экземпляра НЕЛЬЗЯ. Поэтому поможет либо редизайн модели, либо использование контейнера, либо (кривой вариант, строго не рекомендуется) - обертки примитивов с возможностью изменения содержания из пакета org.omg.CORBA (DoubleHolder, IntHolder, LongHolder...).
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32935962
maddcast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fooВ java все параметры грубо говоря, копируются :(
так что прости прощай передача параметров по адресу :((
Прочитай десять раз источник. Автор сам не понимает структуры ооп.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32936029
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что может быть проще?

Переменные передаются по значению.
Объекты передаются по ссылки.
Сслыки передаются по значению :)

Никаких адресов.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32936391
студент1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗашедшийНикаких "оберток" для String писать не надо - есть StringBuffer, в котором можно изменять значение строки. Его и используй. Далее - изменять значение переданных экземпляров классов - НЕЛЬЗЯ. Можно менять только их состояние. Integer, Double, Long и прочие реализованы так, что изменить их содержание без создания нового экземпляра НЕЛЬЗЯ. Поэтому поможет либо редизайн модели, либо использование контейнера, либо (кривой вариант, строго не рекомендуется) - обертки примитивов с возможностью изменения содержания из пакета org.omg.CORBA (DoubleHolder, IntHolder, LongHolder...).

Спасибо. StringBuffer это похоже то, что надо. А как насчёт примитивных типов int, double, long и др.? Для ни похоже надо писать обёртку, если хочешь передать в функцию и получить обратно изменённое значение?
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32936445
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
студент1 ЗашедшийНикаких "оберток" для String писать не надо - есть StringBuffer, в котором можно изменять значение строки. Его и используй. Далее - изменять значение переданных экземпляров классов - НЕЛЬЗЯ. Можно менять только их состояние. Integer, Double, Long и прочие реализованы так, что изменить их содержание без создания нового экземпляра НЕЛЬЗЯ. Поэтому поможет либо редизайн модели, либо использование контейнера, либо (кривой вариант, строго не рекомендуется) - обертки примитивов с возможностью изменения содержания из пакета org.omg.CORBA (DoubleHolder, IntHolder, LongHolder...).

Спасибо. StringBuffer это похоже то, что надо. А как насчёт примитивных типов int, double, long и др.? Для ни похоже надо писать обёртку, если хочешь передать в функцию и получить обратно изменённое значение?
1) StringBuffer для этого и был сделан :)
2) Если надо возвращать кучу int и double - это, скорее всего, неверное проектирование системы. Потому что вместо пихания примитивов в метод, а потом упихивания их в какой-то объект, на самом деле лучше передавать САМ объект, чтобы с ним уже делать нужное внутри. Ява все-таки не процедурный, а ООП язык, и работать с ним надо НЕ как с С/Pascal.
3) Опять же - если так уж хочется настоять на кривой процедурной архитектуре (по разным причинам) - используй для примитивов соответствующие оболочки (DoubleHolder, LongHolder, IntHolder...) из org.omg.CORBA. Там соответствующие поля сделаны public, и их можно менять. Что-то вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  
 import  org.omg.CORBA.*;

 public   class  HolderTest {

   public   static   void  changeInputValue(IntHolder h){
    h.value =  100 ;
  }

   public   static   void  main(String[] args){
    IntHolder holder =  new  IntHolder( 1 );
    System.out.println("value = "+holder);//"value = 1"
    changeInputValue(holder);
    System.out.println("value = "+holder);//"value = 100"
  }
}
Но - ЛУЧШЕ и ПРАВИЛЬНЕЕ переделать саму архитектуру. Программировать на Java надо в стиле Java, а не перетаскиванием шаблонов процедурного программирования.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942230
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще, как я понимаю, в Java определен синтаксис примитивных типов,классов и массивов. Это оснеовные достаточные условия для создания языка. Поэтому для передачи по ссылке можно использовать еще и массивы ( void Method(int[] i) {i[0]=100;} , void Method2(){int[] i={10}; Method(i) }) , этот сиснтакис может даже больше понравиться .
Но вот вопрос - почему в Java не сделано передача примитивных типов по значению - это конечно интересно и ,видимо, - ошибка разработчиков.
2 Guest_569123 >
В книге Брюса Эккеля написанно int, Double, и тд ("простые типы") создаются для большей скорости в стеке
Это Эккель скосил малость - без примитивных типов вообще нельзя!
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942311
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiВообще, как я понимаю, в Java определен синтаксис примитивных типов,классов и массивов. Это оснеовные достаточные условия для создания языка. Поэтому для передачи по ссылке можно использовать еще и массивы ( void Method(int[] i) {i[0]=100;} , void Method2(){int[] i={10}; Method(i) }) , этот сиснтакис может даже больше понравиться .

Лучше не нарушать общепринятых соглашений и писать названия методов с маленькой буквы :)


Но вот вопрос - почему в Java не сделано передача примитивных типов по значению - это конечно интересно и ,видимо, - ошибка разработчиков.

Примитивные типы передаются по значению.
Или это опечатка у вас?
Если опечатка, то смею вас заверить, отсутствие передачи перменных по ссылки - не ошибка разработчиков, а вполне осознанное действие.
Цель этого - упростить разработку и поддержку кода.

Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 interface  XXX{
  void  m( int  a, AnObject s);
}
 class  AnObject{
     private   int  a;
    AnObject( int  a){
        this .a = a;
    }
    booelan isA( int  a){
          return     this .a == a;
    }
}

...
 int  a =  4 ;
AnObject s =  new  AnObject(a);
xxxImpl.m(a,s);
 if  (s.isA(a)) {
    // 1
}  else  {
    // 2
}
...
Какая из строчек выполнится 1 или 2?
Не зависимо от реализации xxxImpl, я могу утверждать, что будет выполнена строчка 1.
В противном случае, я должен был бы всегда деражать в голове контракты относительно всех реализаций метода m: кто его реализует, в каком случае s cтанет ссылаться на другой AnObject и т.д.

Единственный случай, где оправдана передача по ссылке, это не обходимость вернуть несколько значений из метода.
Но это оправдание, наследие процедурных языков. При хорошем дизайне потребности в этом не возникает, а если возникает, то в случае не хватки времени на редизайн кода, быстро решить эту проблему можно создав класс wrapper для возвращаемого результата.


2 Guest_569123 >
В книге Брюса Эккеля написанно int, Double, и тд ("простые типы") создаются для большей скорости в стеке
Это Эккель скосил малость - без примитивных типов вообще нельзя!
Можно.
Язык SmallTalk не имеет примитивных типов.
(Не надо только путать константные выражения типа "any text", 1231, 'c' cлужащие для обозначения и примитивыне типы (например класс String и запись "ххх"))
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942321
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
константные выражения типа "any text", 1231, 'c' cлужащие для обозначения и примитивыне типы
Т.е. константы служат в качестве обозначения для объектов (например, класс экземпляр класса String и запись "ххх").
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942392
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какая из строчек выполнится 1 или 2?
Не зависимо от реализации xxxImpl, я могу утверждать, что будет выполнена строчка 1.
В противном случае, я должен был бы всегда деражать в голове контракты относительно всех реализаций метода m: кто его реализует, в каком случае s cтанет ссылаться на другой AnObject и т.д.
>

Честно говоря, не понял сути примера и объяснения - нельзя ли еще подробнее - что тут иллюстрируется ?

(Не надо только путать константные выражения типа "any text", 1231, 'c' cлужащие для обозначения и примитивыне типы (например класс String и запись "ххх")) >

Так String вообще не относится к примитивным типам.


2 Guest_569123 >
В книге Брюса Эккеля написанно int, Double, и тд ("простые типы") создаются для большей скорости в стеке
Это Эккель скосил малость - без примитивных типов вообще нельзя!

Можно. Язык SmallTalk не имеет примитивных типов.
>

Я не знаю SmallTalk , но думаю ,что там примитивные типы (или как минимум один примитивный тип) реализованы так или иначе - явно или неявно они существуют . Иначе - какими же данными оперирует язык ? Иначе - то как ? ( Даже , если только логические данные , то они и будут являться тем примитивным типом.)
Например, Как там производится присвоение и использование числа, которое должно быть введено с клавиатуры , или в каких струкурах языка хранится число , или - сложно спросить не зная языка ... , короче - как ??? ;)
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942411
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi
Честно говоря, не понял сути примера и объяснения - нельзя ли еще подробнее - что тут иллюстрируется ?

То что передача по ссылке приводит к накладным расходам на понимание кода.


Так String вообще не относится к примитивным типам.

О том и речь. "ываывыв" - всего лишь обозначение для объекта String.


Я не знаю SmallTalk , но думаю ,что там примитивные типы (или как минимум один примитивный тип) реализованы так или иначе - явно или неявно они существуют . Иначе - какими же данными оперирует язык ? Иначе - то как ? (

Элементарно.
Integer i = 123123; //тоже самое как String s = "фывфыв";
Integer j = 321321;
i.add(j); //вместо i+=j; (само понятие арифметической операции пропадают)
Double d = Double.valueOf(i); // вместо double d = i;
i.equals(j) //вместо i==j - т.к. в общем случае объекты могут быть разными, но значение одинаковое.

При желании создаём наследника от Integer и добавляем метод

Чтение из консоли:
Integer i = new Scanner(System.in).readInteger();
тоже никаких чудес.

Существование "констант" не значит, что существуют примитивыне тип ("" & String).
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942418
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и от констант избавиться, оставив у объектов типа Integer
методы
void inc() //Увеличить значение на 1
и т.п :)
Введя константы Integer.ONE и т.п.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942431
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что передача по ссылке приводит к накладным расходам на понимание кода.
Так не видно, что труднее понимать. Объясните, плиз.

Существование "констант" не значит, что существуют примитивыне тип ("" & String). >
Да константы меня не сбивают с толку.

Integer i = 123123; //тоже самое как String s = "фывфыв";
Integer j = 321321;
i.add(j); //вместо i+=j; (само понятие арифметической операции пропадают)
Ну , переопрделить-то нельзя add для Integer, т.е. нельзя сделать чтобы 1+2=4 !?
А это и говорит об некоторых непреложных отличиях этого типа (именно как примитивного типа) от остальных классов - т.е. примитивные типы , во-первых ,однозначно определяют операции над ними - не могут быть модифицированы, и , во-вторых, без них не могут строиться остальные объекты - это базовые типы для обработки .
Может,конечно, я не верно понимаюЮ но пока, вроде - так .
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942444
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и еще,забыл, один аргумент :
Язык без примитивных типов подразумевал бы наличие ТОЛЬКО ОДНОГО корневого класса (типа Object), на основе которого бы строились все остальные типы, а этого быть не может - ибо необходимы как и в любой системе базовые операции и базовый набор данных
(или как минимум один тип данных, из которого босредством базовых операций создавались бы ВСЕ ОСТАЛЬНЫЕ) .
Т.е. для любой развивающейся системы нужен базис данных и операций - это и есть суть примитивных типов.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942508
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefiДа и еще,забыл, один аргумент :
Язык без примитивных типов подразумевал бы наличие ТОЛЬКО ОДНОГО корневого класса (типа Object), на основе которого бы строились все остальные типы, а этого быть не может - ибо необходимы как и в любой системе базовые операции и базовый набор данных
(или как минимум один тип данных, из которого босредством базовых операций создавались бы ВСЕ ОСТАЛЬНЫЕ) .
Т.е. для любой развивающейся системы нужен базис данных и операций - это и есть суть примитивных типов.

Вот же лол :)

Можно или нельзя создать наследника от класса, зависит от того, как он объявлен.
Класс стринг не может иметь наследников, ты не можешь переопредлить ни один его метод, от этого же он не становится примитивным классом :)

Тоже самое с Integer, о котором я упоминал в своём посте.
Если не объявлять его как final, то делай подкласс и переопределяй метод add.


Вот тебе пример.
Я определил класс Integer положительных целых чисел.
И операции: добавление единицы, добавление произвольного значения и сравнение на равенство. При желании можешь дописать другие методы :)

Сколько примитивных типов мне для этого потребовалось?
Ничто не мешает весь язык переписать в такой же манере...
Теперь понятно?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
 class   Boolean  {
     public   static   final   Boolean  TRUE =  new   Boolean ();
     public   static   final   Boolean  FALSE =  new   Boolean ();

     private   Boolean () {};
}

 class  ListItem {
    ListItem next;

     void  addToTail(ListItem toAdd) {
         if  (next ==  null ) {
            next = toAdd;
        }  else  {
            next.addToTail(toAdd);
        }
    }

     Boolean  hasTheSameLength(ListItem item) {
         if  (next ==  null  && item.next ==  null ) {
             return   Boolean .TRUE;
        }
         if  (next !=  null  || item.next !=  null ) {
             return  next.hasTheSameLength(item.next);
        }
         return   Boolean .FALSE;
    }

    ListItem copy() {
        ListItem list =  new  ListItem();
        list.next = next ==  null  ?  null  : next.copy();
         return  list;
    }
}

 class  Integer {
     private  ListItem list;

    Integer() { //create Zero Integer.
    }

    Integer inc() {
         if  (list ==  null ) {
            list =  new  ListItem();
        }  else  {
            add( new  Integer().inc());
        }
         return   this ;
    }

    Integer add(Integer i) { //add value
        list.addToTail(i.list.copy());
         return   this ;
    }

     Boolean  isEquals(Integer i) {
         return  list.hasTheSameLength(i.list);
    }
}

 public   class  TestUsage {
     public   static   void  main(String[] args) {
        Integer two =  new  Integer().inc().inc();
        Integer three =  new  Integer().inc().inc().inc();
        two.add(three);

        Integer five =  new  Integer().inc().inc().inc().inc().inc();

         if  (two.isEquals(five) ==  Boolean .TRUE) {
            System.out.println("ok");
        }
    }
}
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32942515
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прости, торопился, ерунду написал. Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
 class   Boolean  {
     public   static   final   Boolean  TRUE =  new   Boolean ();
     public   static   final   Boolean  FALSE =  new   Boolean ();

     private   Boolean () {};
}

 class  ListItem {
    ListItem next;

     void  addToTail(ListItem toAdd) {
         if  (next ==  null ) {
            next = toAdd;
        }  else  {
            next.addToTail(toAdd);
        }
    }


    ListItem copy() {
        ListItem list =  new  ListItem();
        list.next = next ==  null  ?  null  : next.copy();
         return  list;
    }

     static   Boolean  hasTheSameLength(ListItem first, ListItem second) {
         if  (first ==  null  && second ==  null ) {
             return   Boolean .TRUE;
        }
         if  (first !=  null  && second !=  null ) {
             return  hasTheSameLength(first.next, second.next);
        }
         return   Boolean .FALSE;
    }
}

 class  Integer {
     private  ListItem list;

    Integer() { //create Zero Integer.
    }

    Integer inc() {
         if  (list ==  null ) {
            list =  new  ListItem();
        }  else  {
            add( new  Integer().inc());
        }
         return   this ;
    }

    Integer add(Integer i) { //add value
         if  (i.list ==  null )  return   this ;
         if  (list== null ) {
            list = i.list.copy();
        }  else  {
            list.addToTail(i.list.copy());
        }
         return   this ;
    }

     Boolean  isEquals(Integer i) {
         return  ListItem.hasTheSameLength(list, i.list);
    }
}

 public   class  TestUsage {
     public   static   void  main(String[] args) {
        Integer zero =  new  Integer();
        Integer two =  new  Integer().inc().inc().add(zero);
        zero.add(two);
         if  (two.isEquals(zero) ==  Boolean .TRUE) {
            System.out.println("0+2: ok");
        }

        Integer three =  new  Integer().inc().inc().inc();
        two.add(three);

        Integer five =  new  Integer().inc().inc().inc().inc().inc();

         if  (two.isEquals(five) ==  Boolean .TRUE) {
            System.out.println("2+3: ok");
        }
    }
}
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32943737
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 NotGonnaGetUs >

Ну, я могу согласиться,что обработку целочисленных множеств можно реализовать с помощью ООП,
да и то, такой язык не будет жизнеспособным :
Код: plaintext
1.
2.
3.
4.
Integer five    =  new  Integer().inc().inc().inc().inc().inc();
Integer million =  new  Integer().inc().inc()............  // так что ли ;)  ? 
// Как в начале программы не определив все данные до 1000000 произвести операцию
// million.add(five)   ?
Т.е. он будет работать лишь на весьма ограниченном множестве данных,

А как быть с потребностью реализовывать несчетные множества - чисел с плав.зпт. ?
Т.е. не получается создать универсальный язык охватывающий все базовые типы данных математики. И Это в отличие от подхода, когда мы их вводим как отдельную необходимую сущность.


Можно или нельзя создать наследника от класса, зависит от того, как он объявлен.
Класс стринг не может иметь наследников, ты не можешь переопредлить ни один его метод, от этого же он не становится примитивным классом :)
>
Здесь, мне кажется, ты не правильно меня понял . Я хотел сказать,что необходимы примитивные типы данных именно как базовые типы, на которых бы строились все остальные операции языка и поэтому нельзя допускать переопределение операций над примитивными типами. Иначе бы различные программы по разному интерпретирующие операции над одним и тем же примитивным типом не поняли бы друг друга.
Поэтому это и есть необходимое условие для примитивных типов или их заменителей.
Кстати, ты не ответил, в SmallTalk Integer() - финальный ?


B еще , все же не мог бы ты объяснить, то, что я спрашивал выше -

То что передача по ссылке приводит к накладным расходам на понимание кода.
Так не видно, что труднее понимать. Объясните, плиз.
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32944518
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefi2 NotGonnaGetUs >

Ну, я могу согласиться,что обработку целочисленных множеств можно реализовать с помощью ООП,
да и то, такой язык не будет жизнеспособным :
Код: plaintext
1.
2.
3.
4.
Integer five    =  new  Integer().inc().inc().inc().inc().inc();
Integer million =  new  Integer().inc().inc()............  // так что ли ;)  ? 
// Как в начале программы не определив все данные до 1000000 произвести операцию
// million.add(five)   ?
Т.е. он будет работать лишь на весьма ограниченном множестве данных,

С двоичной записью знаком?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 static   final  Integer I1 =  new  Integer().inc();
 static   final  Integer I2  =  new  Integer().inc().inc();
 static   final  Integer I4  = I2.copy().add(I2);
 static   final  Integer I8  = I4.copy().add(I4);
 static   final  Integer I16  = I8.copy().add(I8);
....

Integer i =  new  Integer().add(I8).add(I2).add(I1); // 1011b = 11d. 


А как быть с потребностью реализовывать несчетные множества - чисел с плав.зпт. ?

Не существует в языках программирования несчётных множеств.
Неужели не очевидно? Мой Integer и то универсальнее int - в java.
У меня макс.значение ограничено только памятью :)


Т.е. не получается создать универсальный язык охватывающий все базовые типы данных математики. И Это в отличие от подхода, когда мы их вводим как отдельную необходимую сущность.

Я привёл пример, показывающий, что необходимую сущность натуральное число - можно спокойно не вводить. Точнее ввести её в качестве объекта.
Реализация объекта - в натив кодах, или при помощи "чистого" языка - дело десятое.
Что называть базовым типом данных математики - тоже далеко не очевидно.
Мне кажется тип "произвольная функция многих переменных" и операции интеграл, производная вполне "базовый тип данных математики".
Тебе тоже так кажется? И ты считаешь, что нужно создать такой примитивный тип?

Здесь, мне кажется, ты не правильно меня понял . Я хотел сказать,что необходимы примитивные типы данных именно как базовые типы, на которых бы строились все остальные операции языка и поэтому нельзя допускать переопределение операций над примитивными типами. Иначе бы различные программы по разному интерпретирующие операции над одним и тем же примитивным типом не поняли бы друг друга.
Поэтому это и есть необходимое условие для примитивных типов или их заменителей.
Ну еб-та. Каждая программа в праве использовать ту реализацию Integer, что ей хочется. Если тебе хочется что бы выполнялось "необходимое тебе условие", добавь модификатор final в определении класса.


Кстати, ты не ответил, в SmallTalk Integer() - финальный ?

А был такой вопрос?
Я не в курсе. Если интресно, google.ru поможет.
Не зависимо от это, тот факт, что в SmallTalk нет примитивных типов - останется фактом.


------
Больше я не буду говорить на эту тему.
Пойми простую вещь.
То что ты называешь примитивными типами объединяет две вещи:
- представление в виде строк, для того что бы программист мог проинициализировать некую сущность(целое число, дробное число).
- действия над этими сущностями (умножить, поделить, привести целое к вещественному и т.д.).

String и "фывфыв" - пример того, что константная запись не обязательно обозначает примитивный тип.

int и 1231 - пример примитивного типа.
Но ничто, абсолютно ничто, не мешает int заменить на Integer, такой же класс, как String. И тогда в языке не останется примитивных типов.

Об этом говорит автор книжки, на которую ты сслылся. Если это трудно понять, то сорри :)


B еще , все же не мог бы ты объяснить, то, что я спрашивал выше -

То что передача по ссылке приводит к накладным расходам на понимание кода.
Так не видно, что труднее понимать. Объясните, плиз.

Пробовал читать чужой код, особенно такой, где нет комментариев?
Глядя на вызов m(a,s) - ты сразу скажешь, что этот метод может изменить ссылку s, так что она будет ссылаться на другой объект? А сколько времени потребуется, что бы выяснить в каких случаях ccылка останется не изменной, а будет просто изменено состояние объекта? А теперь учти, что метод m может быть реализован 10 разными способами, после того, как код его использующий был уже написан.
В случае предачи по значению - всё просто - "a" всега будет "а", "s" всегда ссылка на один и тот же объект после вызова любого метода.

Сторонники процедурного программирования будут от этого плакать - их проблемы.

Даже не знаю, как подругому это написать. В живую это на много проще сделать :)

Можешь считать это всё лично моим мнением и мнением ряда других программистов, и не принимать за истину в последней инстанции :)
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32944665
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Сторонники процедурного программирования будут от этого плакать - их проблемы.

...или научатся не пользоваться примитивными типами, а начнут определять собственные классы и возвращать их результатом работы метода :)
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32944676
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедший NotGonnaGetUs
Сторонники процедурного программирования будут от этого плакать - их проблемы.

...или научатся не пользоваться примитивными типами, а начнут определять собственные классы и возвращать их результатом работы метода :)

Мне кажется, что от этого они станут плакать ещё больше, но позже :)
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32944925
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С двоичной записью знаком? >
Двоичная или еще какая запись здесь абсолютно параллельно.
Ты ВСЕГДА вынужден будешь вначале создать с огромными трудностями некое данное а потом его использовать.
И это все справедливо ТОЛЬКО для натуральных чисел.

Не существует в языках программирования несчётных множеств.
Неужели не очевидно? >
Зато существет их приближение (в в технике никогда ничего другого и не может быть - только приближения) - скажем , double а Java, определяемое возможностями реализации - разрядной сеткой и способностью АЛУ процессора выполять операции над ним.
У тебя же никогда не будет оно введено, как,впрочем, и операция деления.

У меня макс.значение ограничено только памятью :) >
И бесконечным усложнением программы, связаном с определением данного всякий раз как только потребуется его использовать.


Что называть базовым типом данных математики - тоже далеко не очевидно.
Мне кажется тип "произвольная функция многих переменных" и операции интеграл, производная вполне "базовый тип данных математики". >Базовые типы - это основные числовые подмножества действительных чисел : целые(с натуральными внутри), рациональные и иррациональные.
Плюс аксиоматически введенные операции Сложения и Умножения над действит. числами. Все!
Все остальное построено на них.

Кстати, ты не ответил, в SmallTalk Integer() - финальный ?
А был такой вопрос?
Я не в курсе. >
Вопрос этот следовал из моего ответа на то, что в SmallTalk нет примитивных типов
Если ты не в курсе, то зачем утверждать? Или надо уж тогда показать это.

Пойми простую вещь.
То что ты называешь примитивными типами объединяет две вещи:
- представление в виде строк, для того что бы программист мог проинициализировать некую сущность(целое число, дробное число).
- действия над этими сущностями (умножить, поделить, привести целое к вещественному и т.д.). >

Так я так и понимаю, и понимаю, что не удастся с помощюь ООП конечной(а не бесконечно длинной ) программой описать числовые множества, необходимые для работы.

Пробовал читать чужой код, особенно такой, где нет комментариев?
Глядя на вызов m(a,s) - ты сразу скажешь, что этот метод может изменить ссылку s, так что она будет ссылаться на другой объект? А сколько времени потребуется, что бы выяснить в каких случаях ccылка останется не изменной, >

А сделать вызов с m(a,@s) было слабо придумать - тогда бы сразу было видно по ссылке передается или нет. Вот и вся недолга' ;)

----------------------------

PS. Если вы пользуетесь(причем,заметьте, - всю жизнь) примитивными типами, а не строите свои, используя мощь ООП, получается вы являетесь сторонниками процедурного программирования ;)
...
Рейтинг: 0 / 0
Объекты типа String, Integer, Double и т.д., как аргументы функции
    #32944957
kefi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По сути речь идет о том, можно ли, используя только концепцию ООП, не вводя некоторых примитивных (базовых) типов и операций над ними, построить язык универсальный программирования.
Ну, если используя только возможности создания новых объектов, можно реализовать в конечном коде все то, что умеет делать АЛУ с числами,
то тогда я соглашусь с тем, что возможно не использовать примитивные типы.
Хотя хотелось бы увидеть примеры реализации.
По всей видимости , такой язык получится с очень сложным представлением этих данных и сложной их обработкой.
Что и cделает его нежизнеспособным.
Поэтому я и про SmallTalk сомневаюсь.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Объекты типа String, Integer, Double и т.д., как аргументы функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]